2009-06-06 16 views
119

Jak zrobić miejsce w klauzuli podobne do jednego w SQL Server?Gdzie klauzula IN w LINQ

Zrobiłem je sam, ale czy ktoś może poprawić to?

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

Odpowiedz

191

To wyrażenie powinno zrobić to, co chcesz osiągnąć.

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

to będzie porównać wartości ciąg, ale co z ids? –

+0

@JitendraPancholi Możesz użyć łączenia dla liczb całkowitych. – Eugene

+0

@JitendraPancholi, jeśli utworzysz listę , możesz sprawdzić identyfikatory. Jest obsługiwany w .Net 4. Nie jestem pewien wcześniejszych wersji. –

81

To przekłada się na gdzie klauzuli w 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)); 

W przypadku zapytania, można zrobić coś takiego ...

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

Dziękuję;) Pomógł mi również +1 –

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

"In" punkt jest wbudowana linq poprzez .Contains() sposobu.

Na przykład, aby wszystkie osoby, których .States są "NY" lub "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

Witaj na stronie SO, tutaj dobrze jest wyjaśnić, dlaczego używać rozwiązania, a nie tylko w jaki sposób. To sprawi, że twoja odpowiedź będzie bardziej wartościowa i pomoże dalszemu czytelnikowi lepiej zrozumieć, jak to robisz. Proponuję również zapoznać się z naszym FAQ: http://stackoverflow.com/faq. – ForceMagic

2

To trochę inny pomysł. Ale przyda ci się. Użyłem sub-kwerendy wewnątrz głównej kwerendy linq.

Problem:

powiedzmy mamy płytę dokumentów. Schemat następująco schematu: dokument (nazwa, wersja, auther, ModifiedDate) Keys kompozytowe: nazwa, wersja

Więc musimy uzyskać najnowsze wersje wszystkich dokumentów.

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

Lubię go jako metodę rozszerzenia:

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

Teraz rozmowy:

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

można przekazać poszczególne wartości zbyt:

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

Czujesz się bardziej naturalny i bliższy sql.

+1

gdzie powinienem napisać tę metodę rozszerzenia – Rohaan

+0

@Rohaan, w dowolnej klasie statycznej (która nie jest generyczna i nie jest zagnieżdżona) – nawfal

+0

Jest tylko przebieg w pisaniu klasy rozszerzenia, jeśli zamierzasz ponownie wykorzystać część Where w części twojego linq. Wzniesiono odpowiedź, ale chciałem tylko pozwolić innym, którzy natkną się na to pytanie i pójdą prosto na drogę metody rozszerzenia. – 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>(); 
    } 
}