2010-11-03 6 views
10

ऐसा नहीं लगता कि यह एक रिपोस्ट है, जो शब्द के लिए खोजना मुश्किल है क्योंकि इसका उपयोग सबकुछ (जैसे खोज और) में किया जाता है।लिंक या लैम्ब्डा अभिव्यक्ति का उपयोग करके स्टेटमेंट के बीच एसक्यूएल के बराबर

मैं दिनांक सीमा के आधार पर एक सूची फ़िल्टर करना चाहता हूं।

मेरे पास कुछ तिथियों के साथ एक सूची है और मैं उन्हें दिनांक सीमा से फ़िल्टर करना चाहता हूं। एसक्यूएल में between कथन के बराबर एक लिंक या लैम्बडा है।

उदाहरण के लिए, नीचे दिए गए कोड LINQPad (या दृश्य स्टूडियो) में काम नहीं करेगा:

void Main() 
{ 
    List<ListExample> list = new List<ListExample>(); 

    list.Add(new ListExample("Name1","23 Aug 2010")); 
    list.Add(new ListExample("Name2","23 Aug 2009")); 

    var query = from l in list 
     where l.DateValue between "01 Jan 2010" and "01 Jan 2011" 
     select l; 

} 

public class ListExample 
{ 

    public ListExample(string name, string dateValue) 
    { 
     Name = name; 
     DateValue = DateTime.Parse(dateValue); 
    } 

    public string Name{get;set;} 
    public DateTime DateValue{get;set;} 
} 
+1

का डुप्लिकेट जैसा दिखता है: http://stackoverflow.com/questions/1447635/linq-between-operator –

उत्तर

25

कुछ इस तरह?

public static bool IsBetween(this DateTime dt, DateTime start, DateTime end) 
{ 
    return dt >= start && dt <= end;  
} 

जो मामले में क्वेरी (एक बदलाव के लिए विधि वाक्य रचना) कुछ ऐसा दिखाई देगा:

var query = from l in list 
      where l.DateValue >= new DateTime(2010, 1, 1) 
       && l.DateValue <= new DateTime(2011, 1, 1) 
      select l; 

आप अपनी खुद की विस्तार विधि लिख सकते हैं

var start = new DateTime(2010, 1, 1); 
var end = new DateTime(2011, 1, 1); 
var query = list.Where(l => l.DateValue.IsBetween(start, end)); 

मैं आप देख ' हमने तारों के रूप में तारीखों के साथ कुछ नमूने प्रदान किए हैं। मैं निश्चित रूप से यदि संभव हो तो क्वेरी से अलग पार्सिंग तर्क (DateTime.ParseExact या अन्य) रखें।

+0

धन्यवाद मुझे> = और डेटटाइम बनाने की आवश्यकता है। मुझे लिंक थोड़ा उलझन में मिला क्योंकि उन्होंने वाक्यविन्यास बदल दिया। – Simon

+0

@ सिमॉन: चीयर्स। LINQ के साथ '> =' के पास बहुत कुछ नहीं है; यह 'डेटटाइम' पर एक ओवरलोडेड ऑपरेटर है। यदि आप चाहें तो 'डेटटाइम। कॉम्पारे टॉ' या इसी तरह का उपयोग कर सकते हैं। – Ani

+0

धन्यवाद एनी - डेटटाइम। पर्स सिर्फ लिंककैड में मेरे उदाहरण के लिए था क्योंकि मैं इंटरनेट पर क्लाइंट कोड पोस्ट नहीं करना चाहता था। – Simon

1
var query = from l in list 
     where new DateTime(1,1,2010) <= l.DateValue and DateValue <= new DateTime(1,1,2011) 
     select l; 
निश्चित रूप से

, सामान्य रूप से समय-क्षेत्रों और ग्राहकों पर अलग अलग समय के बारे में चेतावनी और सर्वर LINQ में लागू

+0

ऐसा लगता है कि अगर मैं इकाई ढांचे से लिंक करता हूं तो एक्सटेंशन विधियों को लिंक से इकाइयों द्वारा समर्थित नहीं किया जाता है। क्या यह सही लगता है या मैं कुछ याद कर रहा हूँ। – Simon

+1

NotSupportedException: विधि 'बूलियन IsBetween (System.Nullable'1 [System.DateTime], System.DateTime, System.DateTime, Boolean)' SQL में कोई समर्थित अनुवाद नहीं है। – Simon

1
Datetime DT1 = DateTime.Parse("01 Jan 2010"); 
Datetime DT2 = DateTime.Parse("01 Jan 2011"); 
var query = from l in list 
      where l.DateValue >= DT1 && l.DateValue <= DT2 
      select l; 

आप & & और प्रयोग || जैसे आप सी # के सामान्य बूलियन स्टेटमेंट में होंगे।

संबंधित मुद्दे