लिंक से एसक्यूएल: .FirstOrDefault () चुनिंदा नए {...} पर लागू नहीं है

मैंने अभी यह प्रश्न पूछा है। जो मुझे एक नए सवाल के लिए नेतृत्व :)

इस बिंदु तक, मैंने क्वेरी द्वारा लौटाए गए 0 "पंक्तियों" को संभालने में सक्षम होने के उद्देश्य से लिंक से SQL के साथ सामान का चयन करने के निम्नलिखित पैटर्न का उपयोग किया है:

var person = (from p in [DataContextObject].Persons
              where p.PersonsID == 1
              select new p).FirstOrDefault();

if (person == null)
{
   //handle 0 "rows" returned.
}

लेकिन जब मैं करता हूं तो मैं FirstOrDefault() का उपयोग नहीं कर सकता:

var person = from p in [DataContextObject].Persons
             where p.PersonsID == 1
             select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode };

// Under the hood, this pattern generates a query which selects specific
// columns which will be faster than selecting all columns as the above
// snippet of code does. This results in a performance-boost on large tables.

How do I check for 0 "rows" returned by the query, using the second pattern?



UPDATE:

मुझे लगता है कि मेरा निर्माण विफल रहता है क्योंकि मैं क्वेरी के परिणाम को एक चर ( this._user ) के रूप में घोषित करने की कोशिश कर रहा हूं [DataContext] .User के प्रकार के साथ घोषित किया गया है।

this._user = (from u in [DataContextObject].Users
              where u.UsersID == [Int32]
              select new { u.UsersID }).FirstOrDefault();

संकलन त्रुटि: "AnonymousType # 1" को "[DataContext] .User" में रूपांतरित रूप से रूपांतरित नहीं कर सकता।

इस बारे में कोई विचार है कि मैं इस बारे में कैसे प्राप्त कर सकता हूं? क्या मुझे अपना ऑब्जेक्ट बनाना होगा?

4

5 उत्तर

आप समीकरण क्यों कर सकते हैं? क्या यह आपको एक त्रुटि दे रहा है?

var person = (from p in [DataContextObject].Persons
              where p.PersonsID == 1
              select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode }).FirstOrDefault();

if (person == null) {    
   //handle 0 "rows" returned.
}

यह अभी भी एक वास्तविक वस्तु की तरह एक संदर्भ वस्तु है, यह सिर्फ अज्ञात है, इसलिए कोड संकलित होने से पहले आपको वास्तविक प्रकार नहीं पता है।

13
जोड़ा
मेरा प्रश्न अपडेट किया गया।
जोड़ा लेखक roosteronacid, स्रोत
सहमत हैं, उपरोक्त काम करना चाहिए, जब तक कि एक असंबंधित रनटाइम त्रुटि न हो।
जोड़ा लेखक Codewerks, स्रोत

अपडेट:

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

कॉल करें। फर्स्टऑर्डफॉल्ट (शून्य) इस तरह:

string[] names = { "jim", "jane", "joe", "john", "jeremy", "jebus" };
var person = (
    from p in names where p.StartsWith("notpresent") select 
        new { Name=p, FirstLetter=p.Substring(0,1) } 
    )
    .DefaultIfEmpty(null)
    .FirstOrDefault();

MessageBox.Show(person==null?"person was null":person.Name + "/" + person.FirstLetter);

यह मेरे लिए चाल है।

2
जोड़ा
if (person.Any()) /* ... */;

या

if (person.Count() == 0) /* ... */;
1
जोड़ा

अपने अद्यतन के बारे में: आपको या तो अपना स्वयं का प्रकार बनाना होगा, इस ._user को int होने के लिए बदलें, या संपूर्ण ऑब्जेक्ट का चयन करें, न केवल विशिष्ट कॉलम।

1
जोड़ा

आप अभी भी FirstOrDefault का उपयोग कर सकते हैं। बस ले लो

var PersonFields = (...).FirstOrDefault()  

पर्सफिल्ड्स आपके द्वारा बनाए गए गुणों के साथ शून्य या ऑब्जेक्ट होगा।

0
जोड़ा