2009-06-06 7 views
119

Wie wird eine Where In-Klausel ähnlich einer in SQL Server erstellt?WHERE IN-Klausel in LINQ

Ich habe einen selbst gemacht aber kann jemand bitte dies verbessern?

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

Antwort

191

Dieser Ausdruck sollte tun, was Sie erreichen möchten.

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

das wird String-Werte vergleichen, aber was ist mit IDs ?? –

+0

@JitendraPancholi Sie können einen Join für Ganzzahlen verwenden. – Eugene

+0

@JitendraPancholi Wenn Sie eine Liste erstellen, können Sie nach IDs suchen. Es wird in .Net 4 unterstützt. Nicht sicher von den früheren Versionen. –

81

Dies entspricht einem wo in Klausel in LINQ to SQL ... übersetzen wird

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

Bei der Anfrage, könnte man so etwas tun ...

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

Danke;) Hat mir auch geholfen +1 –

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

Die "IN" -Klausel in linq über die .Contains() Methode aufgebaut ist.

Zum Beispiel bekommen alle Menschen, deren .States das sind "NY" oder "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

Willkommen auf SO, hier ist es eine gute Praxis zu erklären, warum Sie Ihre Lösung verwenden und nicht nur wie. Das wird Ihre Antwort wertvoller machen und dem Leser helfen, besser zu verstehen, wie Sie es tun. Ich schlage auch vor, dass Sie einen Blick auf unsere FAQ werfen: http://stackoverflow.com/faq. – ForceMagic

2

Dieses etwas andere Idee. Aber es wird dir nützlich sein. Ich habe eine Unterabfrage in der Linq-Hauptabfrage verwendet.

Problem:

Lassen Sie sagen, wir Dokument Tisch. Schema wie folgt Schema: Dokument (Name, Version, auther, ModifiedDate) Verbund Keys: Name, Version

Also brauchen wir neuesten Versionen aller Dokumente zu erhalten.

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

ich es als eine Erweiterung Methode mag:

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

Nun rufen Sie:

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

Sie einzelne Werte passieren können:

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

Fühlt sich natürlicher und näher an sql.

+1

wo soll ich diese Erweiterungsmethode schreiben – Rohaan

+0

@Rohaan, in jeder statischen Klasse (das ist nicht generisch und nicht verschachtelt) – nawfal

+0

Es gibt nur Meilen beim Schreiben der Erweiterungsklasse, wenn Sie die Where In Teil Ihrer linq wiederverwendet werden. Upvoted die Antwort, aber wollte nur andere, die auf diese Frage stoßen und direkt für die Erweiterung Methode Route gehen lassen. – 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>(); 
    } 
}