2009-06-06 23 views
119

SQL Server'da bir benzer yan tümcesi nasıl yapılır?IN IN yan tümce LINQ içinde

Tek başıma yaptım ama bunu geliştirebilecek biri var mı?

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

cevap

191

Bu ifade, elde etmek istediğiniz şeyi yapmalıdır.

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

da bana yardımcı oldu, bu dize değerleri karşılaştırır, ancak ids nedir? –

+0

@JitendraPancholi Tamsayılar için bir birleştirmeyi kullanabilirsiniz. – Eugene

+0

@JitendraPancholi Listesini oluşturduysanız, ids için kontrol edebilirsiniz. Bu desteklenmiştir. Net 4. Daha önceki sürümlerden emin değilim. –

81

Bu SQL Linq bendinde yer bir yerde çevirmek olacaktır ... Sorgunuzun durumunda

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

, sen ... böyle bir şey yapabileceğini

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

Teşekkür ederim;) +1 –

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

"IN" şartı .Contains() yöntemi ile linq yerleşiktir.

Örneğin

, kimin .States en şunlardır "NY" veya "FL" Tüm Kişiler almak için:

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

Hoş Geldiniz, burada, çözümünüzü nasıl kullanacağınızı ve nasıl yapıldığını açıklamak iyi bir uygulamadır. Bu, cevabınızı daha değerli hale getirecek ve daha fazla okuyucunun bunu nasıl yaptığınıza dair daha iyi bir anlayışa sahip olmasına yardımcı olacaktır. Ayrıca, SSS’imize bir göz atmanızı öneririz: http://stackoverflow.com/faq. – ForceMagic

2

Bu biraz farklı bir fikir. Ama sizin için yararlı olacaktır. Linq ana sorgusunun içine alt sorgu kullandım.

Sorun:

Let biz belge tablo olduğunu varsayalım. belgesini (isim, sürüm, Auther, ModifiedDate) kompozit Keys: adı,

yüzden tüm belgelerin son sürümlerini almak gerekir versiyon Şeması olarak şema takip eder.

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

Ben bir uzantısı yöntemi olarak hoşuna: Artık

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

aramak: Çok bireysel değerler geçebilir

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

:

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

Daha doğal ve daha sql'ye yakın hisseder.

+1

Bu uzantı yöntemini – Rohaan

+0

@Rohaan, herhangi bir statik sınıfta (genel olmayan ve iç içe değil) yazmalıyım – nawfal

+0

Eğer linq'unuzun Where In In kısmını yeniden kullanacaksanız, uzantı sınıfının yazılmasında yalnızca bir mesafe var. Cevabı iptal ettim, ancak sadece bu soruya giren ve uzatma yöntemi rotası için doğru olan diğer kişilere izin vermek istedim. – 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>(); 
    } 
}