2013-03-07 6 views
30

मैं 60 दिनों के 30 दिनों आज की तारीख में 20 दिन विभिन्न में डेटाबेस में रिकॉर्ड का चयन करने की कोशिश नहीं पहचानता है।LINQ विधि 'System.TimeSpan घटाना (System.DateTime)' विधि

कृपया नीचे में इस क्वेरी को देखते हैं।

var uploads = (
       from files in _fileuploadRepository.Table 
       join product in _productRepository.Table on files.Event equals product.Id 
       where 
        (
       product.EventDate != null && 
        (product.EventDate.Subtract(DateTime.Now).Days <= 60 && product.EventDate.Subtract(DateTime.Now).Days >= 60) || 
        (product.EventDate.Subtract(DateTime.Now).Days <= 30 && product.EventDate.Subtract(DateTime.Now).Days >= 30) || 
        (product.EventDate.Subtract(DateTime.Now).Days <= 20 && product.EventDate.Subtract(DateTime.Now).Days >= 20)) 
        && 
       files.IsSkiped == false 
       select files; 
      ).ToList(); 

लेकिन इस क्वेरी में एक त्रुटि हुई।

enter image description here

मैं अनजान हूँ। कृपया मदद करे।

+1

लैम्ब्डा बयान के बाहर आप गणनाएं करना। जब यह लैम्ब्डा के अंदर होता है जैसे आप इसका उपयोग कर रहे हैं, तो आप ऐसा करने की कोशिश कर रहे हैं जब EntityFramework गणना करता है। – Middas

+0

तो LINQ से SQL को 'product.EventDate.Subtract (DateTime.Now) जैसी अभिव्यक्ति "अनुवाद" नहीं होगी। सी # में एक विकल्प के अंकन 'product.EventDate है - DateTime.Now' जहां एक का उपयोग करता है [शून्य (' -') ऑपरेटर की एक अधिभार] (http://msdn.microsoft.com/en-us/library/1905yhe2। aspx)। क्या किसी को पता है कि _that_ LINQ से SQL के साथ काम करेगा?आखिरकार, एसक्यूएल बोलियों में तिथियों का घटाव भी संभव है। –

+0

@JeppeStigNielsen ईएफ के लिए आप EntityFunctions का उपयोग कर सकते हैं। डिफडेज़ – scartag

उत्तर

33

सरल दृष्टिकोण सीमा इससे पहले कि आप क्वेरी निष्पादित बाहर काम करने के लिए है:

// Only evaluate DateTime.Now once for consistency. You might want DateTime.Today instead. 
DateTime now = DateTime.Now; 
DateTime nowPlus60Days = now.AddDays(60); 
DateTime nowPlus30Days = now.AddDays(30); 
DateTime nowPlus20Days = now.AddDays(20); 

var query = ... 
      where product.EventDate <= nowPlus60Days 
      ... 

ध्यान रखें कि आपके वर्तमान क्वेरी भी वास्तव में कोई मतलब नहीं है, प्रत्येक के रूप में "या" 'घ खंड है यह बताते हुए कि दिया गया गणना एक मान और से कम या उसके बराबर मूल्य के बराबर है। यदि आप सरल "बराबर" चाहते हैं तो इसका उपयोग करें। यदि नहीं, तो यह स्पष्ट नहीं है कि आप क्या करने का प्रयास कर रहे हैं।

आप में "कम से कम 20", मूल्यों बाल्टी की कोशिश कर रहे हैं "20-30", "30-60", "60 से अधिक" आप कुछ फार्म का समूह का उपयोग करना होगा।

44

आप EntityFunctions.DiffDays विधि

EntityFunctions.DiffDays(product.EventDate, DateTime.Now) //this will return the difference in days 

अद्यतन

EntityFunctions इस्तेमाल कर सकते हैं तो आप DBFunctions बजाय का उपयोग करना चाहिए अब अप्रचलित है।

System.Data.Entity.DbFunctions.DiffDays(product.EventDate, DateTime.Now) 
+16

EntityFunctions अब अप्रचलित है: इसके बजाय System.Data.Entity.DbFunctions का उपयोग करें। – celerno

2

scartag के जवाब देने के लिए

MSDN documentation for DbFunctions.DiffDays पर जोड़ने के लिए, सीधे या नहीं और जब) DiffDays द्वारा दिया (मूल्य नकारात्मक होगा उल्लेख नहीं है, इसलिए मैंने सोचा कि मैं यहाँ कि जानकारी प्रदान करते हैं:

परिणाम नकारात्मक होगा जब तर्क 1 तारीख से (यानी भविष्य सापेक्ष में करने के लिए) तर्क 2 तारीख बड़ा है।

उदाहरण के लिए, एक गैर-शून्य क्षेत्र ScheduledDeliveryDate के साथ एक तालिका Deliveries दी गई है जिसमें वर्तमान तिथि के संबंध में अतीत और भविष्य दोनों में मूल्य हो सकते हैं, इस क्वेरी को 2 दिनों के भीतर डिलीवरी तिथि/समय के साथ सभी रिकॉर्ड प्राप्त होंगे वर्तमान दिनांक/समय (दोनों अतीत और भविष्य) के दिन:

DateTime now = DateTime.Now; 
var results = from d in Deliveries 
    where (DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) < 2 
     && DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) > -2) 
    select d; 
3

यह काम करना चाहिए:

using System.Data.Entity.SqlServer; 

where (int)SqlFunctions.DateDiff("day", product.EventDate, DateTime.Now) <= 60 
संबंधित मुद्दे