2009-06-06 27 views
119

¿Cómo hacer una cláusula where in similar a una en SQL Server?Donde cláusula IN en LINQ

He hecho uno solo, pero ¿alguien puede mejorarlo?

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; 
    } 

Respuesta

191

Esta expresión debe hacer lo que quiera lograr.

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

esto va a comparar los valores de cadena, pero ¿qué pasa con los identificadores ?? –

+0

@JitendraPancholi Puede usar una combinación para enteros. – Eugene

+0

@JitendraPancholi si crea una lista puede verificar los ID. Es compatible con .Net 4. No estoy seguro de las versiones anteriores. –

81

Esto se traducirá a una cláusula en donde en LINQ a 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)); 

En el caso de la consulta, se podría hacer algo como esto ...

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}); 
+0

Gracias;) me ayudó a 1, así –

4
from state in _objedatasource.StateList() 
where listofcountrycodes.Contains(state.CountryCode) 
select state 
6

La cláusula "IN" está incorporado en linq a través del método .Contains().

Por ejemplo, para obtener todas las personas cuyas de .States son "NY" o "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(); 
} 
1
public List<State> GetcountryCodeStates(List<string> countryCodes) 
{ 
    List<State> states = new List<State>(); 
    states = (from a in _objdatasources.StateList.AsEnumerable() 
    where countryCodes.Any(c => c.Contains(a.CountryCode)) 
    select a).ToList(); 
    return states; 
} 
+5

Bienvenido a SO, aquí, es una buena práctica explicar por qué usar su solución y no solo cómo. Eso hará que su respuesta sea más valiosa y ayudará al lector a tener una mejor comprensión de cómo lo hace. También sugiero que eche un vistazo a nuestras preguntas frecuentes: http://stackoverflow.com/faq. – ForceMagic

2

Este bit poca idea diferente. Pero te será útil. He utilizado sub consulta dentro de la consulta principal de linq.

Problema:

Digamos que tenemos superficie para documentos. Esquema de la siguiente manera esquema: documento (nombre, versión, auther, ModifiedDate) claves compuestas: nombre, versión

por lo que necesitamos para recibir las últimas versiones de todos los documentos.

soloution

var result = (from t in Context.document 
          where ((from tt in Context.document where t.Name == tt.Name 
           orderby tt.Version descending select new {Vesion=tt.Version}).FirstOrDefault()).Vesion.Contains(t.Version) 
          select t).ToList(); 
22

me gusta como un método de extensión:

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

Ahora se llaman:

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

Puede pasar valores individuales también:

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

Se siente más natural y más cerca de sql.

+1

donde debería escribir este método de extensión – Rohaan

+0

@Rohaan, en cualquier clase estática (que no es genérica y no está anidada) – nawfal

+0

Hay solo millaje en escribir la clase de extensión si va a reutilizar el lugar Where In de su linq. Volvió a subir la respuesta, pero solo quería dejar que otros que se encuentran con esta pregunta y continúen directamente con la ruta del método de extensión. – JARRRRG

6
public List<Requirement> listInquiryLogged() 
{ 
    using (DataClassesDataContext dt = new DataClassesDataContext(System.Configuration.ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString)) 
    { 
     var inq = new int[] {1683,1684,1685,1686,1687,1688,1688,1689,1690,1691,1692,1693}; 
     var result = from Q in dt.Requirements 
        where inq.Contains(Q.ID) 
        orderby Q.Description 
        select Q; 

     return result.ToList<Requirement>(); 
    } 
}