6

में डेट-पार्ट तुलना कैसे कर सकता हूं मैंने लोगों को सुना है कि समय की तुलना तुलना समय की तुलना में काम नहीं करती है क्योंकि डेटाटाइम का समय हिस्सा होता है।मैं ईएफ

एसक्यूएल में

मैं हमेशा इस तरह की तरह datetime तुलना और यह ठीक काम करता है

select * from employee 
where convert(varchar,dob,112) > '20111201' // this yyyymmdd format. 

कैसे मैं एक LINQ क्वेरी में इस अनुकरण कर सकता है?

+1

क्या आपका मतलब एंटिटी फ्रेमवर्क (= LINQ से Entities) और LINQ से SQL (पूर्व EF ORM) दोनों का मतलब है? – abatishchev

+1

FWIW, यदि आप SQL Server 2008 या ऊपर का उपयोग कर रहे हैं, तो संभवतः आपको उन फ़ील्ड के लिए 'दिनांक' ('दिनांक समय' के बजाय) का उपयोग करना चाहिए, जिनके समय का हिस्सा अप्रासंगिक है (यह संभावना नहीं है कि वास्तव में आपके पास दिन का समय होगा पैदा हुआ था, और इससे भी कम संभावना है कि यह आपके लिए सार्थक होगा)। 'डेटटाइम' का उपयोग करते समय 'दिनांक'' उपलब्ध है और आपको इस बात की परवाह नहीं है कि डेटा आपके सभी अंकीय डेटा को 'फ्लोट' में संग्रहीत करने जैसा होगा चाहे डेटा मूल रूप से अभिन्न है या नहीं। –

उत्तर

2

ध्यान में रखना एक बात यह है कि डेटाबेस कॉलम का प्रतिनिधित्व करने वाले डेटटाइम structs पर संचालन SQL में अनुवाद नहीं करते हैं।

from e in EfEmployeeContext 
where e.DOB.Date > new DateTime(2011,12,01); 

... क्योंकि e.DOB डेटाबेस में जन्म तिथि स्तंभ का प्रतिनिधित्व करता है, और एफई कैसे तिथि उप संपत्ति अनुवाद करने के लिए पता नहीं चलेगा: तो, आप की तरह एक प्रश्न नहीं लिख सकते हैं।

हालांकि, वहाँ एक आसान तरीके को क्या आप चाहते हैं तारीखों के आधार पर दिया गया है:

  • आप सभी कर्मचारियों 12/01/2011 पर एक जन्म तिथि के साथ-साथ उस तारीख के बाद पैदा हुए उन लोगों के रूप को शामिल करना चाहते हैं, तो बस क्वेरी:

    from e in EfEmployeeContext 
    where e.DOB > new DateTime(2011,12,01); 
    
  • आप 12/01/2011 बाद पैदा हुए केवल कर्मचारियों, फिर क्वेरी शामिल करना चाहते हैं:

    from e in EfEmployeeContext 
    where e.DOB >= new DateTime(2011,12,02); 
    

संक्षेप में, मानदंड, जिसका अर्थ निरंतर या शाब्दिक दिनांक समय है जिसके विरुद्ध आप तुलना कर रहे हैं, सेट अप किया जा सकता है, हालांकि आप चाहते हैं। आप केवल उन गुणों में कट्टरपंथी संशोधन नहीं कर सकते हैं जो भविष्यवाणी के भीतर डीबी कॉलम का प्रतिनिधित्व करते हैं। इसका मतलब है कि आप उदाहरण के लिए एक और दिनांक समय स्तंभ के एक प्रक्षेपण के लिए एक दिनांक समय स्तंभ तुलना नहीं कर सकते,:

//get all employees that were hired in the first six months of the year 
    from e in EfEmployeeContext 
    where e.HireDate < new DateTime(e.HireDate.Year, 7, 1); 
+0

इस कोड को ईफ़ेमोस्की कॉन्टेक्स्ट में ई से करता है जहां ई.डीओबी> नया डेटटाइम (2011,12,01); सभी संस्कृति में काम करें क्योंकि यूके की तारीख अलग है जहां ब्रिटेन अलग है। – Thomas

+0

डेटटाइम का कन्स्ट्रक्टर हमेशा साल पहले, फिर महीना, दिन लेता है, इस पर ध्यान दिए बिना कि संस्कृति को स्ट्रिंग के रूप में प्रदर्शित करने के लिए इस्तेमाल किया जा सकता है। – KeithS

10

आप नेट 4 या उपयोग कर रहे हैं इसके बाद के संस्करण, बस EntityFunctions.TruncateTime सहायक विधि का उपयोग करें। यह इस प्रकार के डेटाटाइम-टू-डेट रूपांतरण को आपके लिए एसक्यूएल में अनुवाद करेगा।

from e in EfEmployeeContext 
where EntityFunctions.TruncateTime(e.DOB) > new DateTime(2011,12,01); 
+0

अगर मैं linq 2 sql का उपयोग कर रहा हूं तो मैं कैसे काम करूं? – Thomas

+3

यदि आप 'LINQ से SQL' का उपयोग कर रहे हैं तो मैं टैग को 'EntityFramework' और' linq-to-entities' 'के साथ-साथ आपके प्रश्न शीर्षक में ईएफ के संदर्भ में हटा दूंगा। LINQ से SQL का उपयोग करना मतलब है कि आपका प्रश्न अप्रासंगिक हो जाता है। – mclark1129

+0

जब लोग LINQ से SQL का उपयोग करते हैं तो दिनांक तुलना तब नहीं हो सकती है? – Thomas