2010-11-03 17 views
8

लिंक से इकाइयों के साथ, मैं मिलान पंक्ति के पास पंक्तियों को खोजने के लिए लॉग तालिका से पूछताछ करने का प्रयास कर रहा हूं। मुझे क्वेरी के अंदर एक तारीख जोड़ने में परेशानी हो रही है। अभी तक मेरे पास इतना ही है।लिंक से इकाइयों में दिनांक

from 
    l in objectSet.Logs 
let 
    match = objectSet.Logs.Where(whatever).FirstOrDefault() 
where 
     l.Timestamp > (match.Timestamp - twoHours) 
    && l.Timestamp < (match.Timestamp + twoHours) 
select 
    l 

"जो कुछ भी" शर्त यह है कि पंक्ति मैं में दिलचस्पी रखता हूँ पाता बाहर छोड़कर, "twoHours" variably ऐसी समयावधि, एक .AddHours() समारोह और इसके आगे किया गया है। मुझे सही तरीका नहीं मिला है कि ईएफ एसक्यूएल उत्पन्न कर सकता है जो एक फ़ील्ड (match.Timestamp) से मूल्य को निरंतर जोड़ता है।

स्पष्ट समाधान "मैच" क्वेरी पहले करना है और फिर दूसरी क्वेरी में शाब्दिक मान का उपयोग करना है, लेकिन मैंने यहां मुख्य समस्या (क्वेरी में दिनांक जोड़ना) और वास्तविक तथ्य में कोड उदाहरण को सरल बना दिया है मेरी क्वेरी अधिक जटिल है और यह आदर्श नहीं होगा।

चीयर्स

+0

मैं ने वही समस्या पड़ा है पक्ष में पदावनत किया गया है। समस्या यह है कि .ddHours() में SQL समकक्ष नहीं है, और इस प्रकार, लिंक SQL अभिव्यक्ति में कनवर्ट करने में असमर्थ है। मैंने कॉल करके देरी निष्पादन का आह्वान करके इसे दूर कर लिया है। टोस्टिस्ट() और फिर अपना ऐड-मेमोरी संग्रह पर एडीडहॉर्स() फ़िल्टर को लागू करना। – dotariel

+0

@ XSaint32, यह दोगुना गलत है। वहाँ * है * [ए (टी) एसक्यूएल समतुल्य,] (http://msdn.microsoft.com/en-us/library/ms186819.aspx) और आप * इसे ईएफ से कॉल कर सकते हैं। –

+0

@ क्रेग - इनपुट के लिए धन्यवाद। मुझे इस बारे में पता नहीं था। – dotariel

उत्तर

11

आप EntityFunctionsclass का उपयोग कर एक AddHours उत्पन्न कर सकते हैं।

from 
    l in objectSet.Logs 
let 
    match = objectSet.Logs.Where(whatever).FirstOrDefault() 
where 
     (l.Timestamp > EntityFunctions.AddHours(match.Timestamp, -1 * twoHours)) 
    && // ... 
select 
    l 

हालांकि, इस WHERE एक सूचकांक के साथ अनुकूलन की जब तक आप स्तंभ पर एक अभिव्यक्ति सूचकांक उम्मीद नहीं है।

+0

बहुत बढ़िया, धन्यवाद क्रेग –

+0

नोट, 'EntityFunctions' को अप्रचलित के रूप में चिह्नित किया गया है। नामस्थान 'System.Data.Entity' में प्रतिस्थापन वर्ग 'DbFunctions' का उपयोग करें। – Amasa

-1

जैसा कि इस आलेख में वर्णित किया गया था - http://www.devart.com/blogs/dotconnect/?p=2982#first, अपने प्रश्नों का उपयोग करके दिनांक समय के बजाय पैरामीटर (घोषित चर) का उपयोग करें।

3

EntityFunctions की DbFunctions

public int GetNumUsersByDay(DateTime Date) 
     { 
      using (var context = db) 
      { 
       var DateDay = new DateTime(Date.Year, Date.Month, Date.Day); 
       var DateDayTomorrow = DateDay.AddDays(1); 
       return context.Users.Where(m => DbFunctions.AddHours(m.DateCreated,-5) >= DateDay && m.DateCreated < DateDayTomorrow).Count(); 
      } 
     } 
+0

... यदि आप ईएफ 6 या बाद में हैं ... –

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