2009-06-06 14 views
119

में खंड में SQL सर्वर में एक जैसा क्लॉज बनाने के लिए कैसे करें?जहां LINQ

मैंने खुद को एक बना दिया लेकिन क्या कोई इसे सुधार सकता है?

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

उत्तर

191

यह अभिव्यक्ति वह करना चाहिए जो आप प्राप्त करना चाहते हैं।

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

यह स्ट्रिंग मानों की तुलना करेगा, लेकिन आईडी के बारे में क्या ?? –

+0

@JitendraPancholi आप पूर्णांक के लिए शामिल होने का उपयोग कर सकते हैं। – Eugene

+0

@ जितेंद्रेंद्रकोली यदि आप एक सूची बनाते हैं तो आप आईडी के लिए जांच सकते हैं। यह .Net 4 में समर्थित है। पिछले संस्करणों के बारे में सुनिश्चित नहीं है। –

81

यह एसक्यूएल को Linq में खंड में एक जहां के लिए अनुवाद कर देगा ...

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

आपकी क्वेरी के मामले में, आप कुछ इस तरह कर सकता है ...

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

धन्यवाद;) मुझे भी मदद मिली –

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

"में" खंड .Contains() विधि के माध्यम से LINQ में बनाया गया है।

उदाहरण के लिए, सभी लोग जिनके .States के हैं "न्यूयॉर्क" या "फ्लोरिडा" पाने के लिए:

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

एसओ पर आपका स्वागत है, यहां, यह समझाने का एक अच्छा अभ्यास है कि आपके समाधान का उपयोग क्यों करें और न कि कैसे। इससे आपका उत्तर अधिक मूल्यवान हो जाएगा और आप इसे कैसे करते हैं इसकी बेहतर समझ रखने के लिए आगे पाठक की सहायता करेंगे। मैं यह भी सुझाव देता हूं कि आप हमारे अक्सर पूछे जाने वाले प्रश्न देखें: http://stackoverflow.com/faq। – ForceMagic

2

यह थोड़ा अलग विचार है। लेकिन यह आपके लिए उपयोगी होगा। मैंने linq मुख्य क्वेरी के अंदर उप क्वेरी का उपयोग किया है।

समस्या:

Let कहते हैं कि हम दस्तावेज़ तालिका है। स्कीमा के रूप में इस प्रकार है स्कीमा: दस्तावेज़ (नाम, संस्करण, लेखक, modifieddate) समग्र कुंजी: नाम, संस्करण

तो हम सभी दस्तावेजों के नवीनतम संस्करण प्राप्त करने के लिए की जरूरत है।

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

मैं इसे एक विस्तार पद्धति के रूप में की तरह है:

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

अब आप फोन:

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

आप अलग-अलग मान भी पारित कर सकते हैं:

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

अधिक प्राकृतिक और एसक्यूएल के करीब लगता है।

+1

मुझे इस विस्तार विधि को – Rohaan

+0

@ रोहन, किसी भी स्थैतिक वर्ग (जो सामान्य नहीं है और नेस्टेड नहीं है) में मुझे कहां लिखना चाहिए – nawfal

+0

यदि आप अपने linq के हिस्से में कहां उपयोग कर रहे हैं तो एक्सटेंशन क्लास लिखने में केवल माइलेज है। उत्तर को ऊपर उठाया, लेकिन सिर्फ उन लोगों को देना चाहता था जो इस प्रश्न में आते हैं और विस्तार विधि मार्ग के लिए सीधे जाते हैं। – 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>(); 
    } 
} 
संबंधित मुद्दे