152 votes

Clause Where IN dans LINQ

Comment faire une clause where in similaire à celle de SQL Server ?

J'en ai fait un moi-même mais quelqu'un peut-il l'améliorer ?

    public List<State> Wherein(string listofcountrycodes)
    {
        string[] countrycode = null;
        countrycode = listofcountrycodes.Split(',');
        List<State> statelist = new List<State>();

        for (int i = 0; i < countrycode.Length; i++)
        {
            _states.AddRange(
                 from states in _objdatasources.StateList()
                 where states.CountryCode == countrycode[i].ToString()
                 select new State
                 {
                    StateName  = states.StateName                    

                 });
        }
        return _states;
    }

245voto

Daniel Brückner Points 36242

Cette expression doit permettre de réaliser ce que vous souhaitez obtenir.

dataSource.StateList.Where(s => countryCodes.Contains(s.CountryCode))

93voto

Scott Ivey Points 19577

Cela se traduira par une clause where in dans Linq to SQL...

var myInClause = new string[] {"One", "Two", "Three"};

var results = from x in MyTable
              where myInClause.Contains(x.SomeColumn)
              select x;
// OR
var results = MyTable.Where(x => myInClause.Contains(x.SomeColumn));

Dans le cas de votre requête, vous pourriez faire quelque chose comme ceci...

var results = from states in _objectdatasource.StateList()
              where listofcountrycodes.Contains(states.CountryCode)
              select new State
              {
                  StateName = states.StateName
              };
// OR
var results = _objectdatasource.StateList()
                  .Where(s => listofcountrycodes.Contains(s.CountryCode))
                  .Select(s => new State { StateName = s.StateName});

35voto

nawfal Points 13500

Je l'apprécie comme une méthode d'extension :

public static bool In<T>(this T source, params T[] list)
{
    return list.Contains(source);
}

Maintenant vous appelez :

var states = _objdatasources.StateList().Where(s => s.In(countrycodes));

Vous pouvez également transmettre des valeurs individuelles :

var states = tooManyStates.Where(s => s.In("x", "y", "z"));

Il semble plus naturel et plus proche de sql.

6voto

nikmd23 Points 5780

La clause "IN" est intégrée à linq via la méthode .Contains().

Par exemple, pour obtenir toutes les personnes dont le nom d'État est "NY" ou "FL" :

using (DataContext dc = new DataContext("connectionstring"))
{
    List<string> states = new List<string>(){"NY", "FL"};
    List<Person> list = (from p in dc.GetTable<Person>() where states.Contains(p.State) select p).ToList();
}

4voto

Andrija Cacanovic Points 3518
from state in _objedatasource.StateList()
where listofcountrycodes.Contains(state.CountryCode)
select state

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X