LINQ

2012-10-19 7 views
9

में डेटटाइम के रूप में कास्टिंग स्ट्रिंग को मेरे पास निम्न प्रारूप वाला एक टेबल है।LINQ

PID  ID  Label  Value 
------------------------------------------ 
1  1  First Name Jenna 
1  2  DOB   10/12/1980 

मैं सभी PIDs पुनः प्राप्त करने के जहां प्रथम नाम जम्मू और जन्म तिथि का महीना के साथ शुरू मेरी कोड में से 10

है की जरूरत है, मैं सी # में DataTable में इन पुनः प्राप्त और फिर LINQ उपयोग करने के लिए प्राप्त करने का प्रयास परिणाम मैं चाहता हूँ। यह सिर्फ एक उदाहरण है। ये लेबल कुछ भी उपयोगकर्ता परिभाषित हो सकता है।

LINQ का उपयोग करके मैं उन सभी पीआईडी ​​को पुनः प्राप्त करने में सक्षम हूं जहां पहला नाम जे के साथ शुरू होता है, लेकिन हर बार जब मैंने डीओबी के लिए मूल्य कास्ट करने का प्रयास किया तो मुझे वैध त्रुटि नहीं मिली। मैं डेटाबेस में कॉलम प्रकार को नहीं बदल सकता क्योंकि मूल्य में किसी भी प्रकार की जानकारी हो सकती है।

यहां मेरे कोड का एक टुकड़ा है। मैं LINQ के लिए नया हूं, और अभी भी इसके आसपास पता लगाने की कोशिश कर रहा हूं।

var resultQuery = from r in query.AsEnumerable() 
where (r.Field<string>("Label") == Label && 
r.Field<DateTime>("Value").Month == 10) 
select r.Field<int>("PID"); 
+0

"जेन्ना" की दिनांक समय मूल्य क्या है पर फ़िल्टर? मुझे यकीन नहीं है कि यह व्यवहार्य है। – Bobson

उत्तर

3

नहीं के बाद से तालिका के मान कॉलम में सभी आइटम DateTime के लिए परिवर्तनीय हैं, क्या आप अमान्य रूपांतरण पर विफल हो जाएगा है। आप उस खंड में जोड़ सकते हैं जो पहले जांचता है कि मान DateTime है और केवल तभी है, इसे परिवर्तित करता है और .Month संपत्ति की जांच करता है।

DateTime d; 
var resultQuery = from r in query.AsEnumerable() 
        where (r.Field<string>("Label") == Label && 
         DateTime.TryParse(r.Field<string>("Value"), out d) && 
         d.Month == 10) 
        select r.Field<int>("PID"); 

संभावित पठनीयता में सुधार करने के लिए, आप भी इस बाहर एक अलग विधि में निकाल सकते:

var resultQuery = from r in query.AsEnumerable() 
        let d = TryGetDate(r.Field<string>("Value")) 
        where (r.Field<string>("Label") == Label && 
         d != null && 
         d.Month == 10) 
        select r.Field<int>("PID"); 

private DateTime? TryGetDate(string value) 
{ 
    DateTime d; 
    return DateTime.TryParse(value, out d) ? d : default(DateTime?); 
} 
+2

पठनीयता और "शुद्धता" के लिए, मेरा मानना ​​है कि तारीख तर्क को एक अलग विधि (डेटटाइम? TryGetDate (स्ट्रिंग मान) में रखना बेहतर होगा और अगर पार्स-सक्षम नहीं है तो शून्य वापस लौटाएं ... – ioctlLR

+0

दोनों धन्यवाद । अगर मैं सिर्फ क्वेरी को चलाता हूं जिस तरह से गोरिक ने स्वयं को सुझाव दिया है, तो यह त्रुटि नहीं है, लेकिन अगर मैं परिणाम सूची में कनवर्ट करने की कोशिश कर रहा हूं और यह विफल हो जाता है। अगर मैं निकालता हूं .मोन == 10, मेरी सूची ठीक काम करती है। पीआईडी ​​= resultQuery.ToList(); जहां पीआईडी ​​को user1760153

+0

के प्रकार पर परिभाषित किया गया है, केवल इतना ही नहीं, लेकिन आपका कोड, जैसा काम नहीं करेगा। यहां तक ​​कि यदि आप किसी तारीख को स्ट्रिंग को पार्स कर सकते हैं, तो आप इसे * तारीख * पर नहीं डाल सकते हैं, जो आप यहां कर रहे हैं। – Servy

2

आप स्मृति जो बहुत ही कुशल नहीं है में छानने खत्म करने के लिए जा रहे हैं।

अपने डेटा तो सबसे पहले चयन

var data= from r in query.AsEnumerable(); 

फिर डेटा

var filtered = from item in data 
       where item.Label == "Label" 
       && Convert.ToDateTime(item.DOB).Month == 10 
       select item.PID; 
संबंधित मुद्दे