2017-06-21 8 views
9

प्रश्न: निम्न कोड में price = co?.price ?? 0, पंक्ति मुझे उपरोक्त त्रुटि देता है। लेकिन अगर मैं co.? से हटा देता हूं तो यह ठीक काम करता है। मैं this MSDN example का पालन करने की कोशिश कर रहा था, जहां वे ? लाइन select new { person.FirstName, PetName = subpet?.Name ?? String.Empty }; पर उपयोग कर रहे हैं, तो ऐसा लगता है कि मुझे ??? और जब नहीं करना है, तो मुझे समझने की आवश्यकता है।एक अभिव्यक्ति वृक्ष लैम्ब्डा में एक नल प्रोपेगेटिंग ऑपरेटर

त्रुटि:

एक अभिव्यक्ति पेड़ लैम्ब्डा शामिल नहीं हो सकता एक अशक्त प्रचार ऑपरेटर

public class CustomerOrdersModelView 
{ 
    public string CustomerID { get; set; } 
    public int FY { get; set; } 
    public float? price { get; set; } 
    .... 
    .... 
} 
public async Task<IActionResult> ProductAnnualReport(string rpt) 
{ 
    var qry = from c in _context.Customers 
       join ord in _context.Orders 
       on c.CustomerID equals ord.CustomerID into co 
       from m in co.DefaultIfEmpty() 
       select new CustomerOrdersModelView 
       { 
        CustomerID = c.CustomerID, 
        FY = c.FY, 
        price = co?.price ?? 0, 
        .... 
        .... 
       }; 
    .... 
    .... 
} 
+0

कृपया त्रुटि पोस्ट करें ... –

+0

मैन मैं चाहता हूं कि सी # ने इसका समर्थन किया! – nawfal

उत्तर

21

उदाहरण आप से उद्धृत किया गया वस्तुओं, जहां अंतर्निहित लैम्ब्डा भाव को LINQ का उपयोग करता है क्वेरी में प्रतिनिधियों को में परिवर्तित कर दिया गया है ... जबकि आप IQueryable<T> क्वेरीज़ के साथ ईएफ या इसी तरह का उपयोग कर रहे हैं, जहां लैम्ब्डा अभिव्यक्तियों को अभिव्यक्ति पेड़ में परिवर्तित कर दिया गया है। अभिव्यक्ति पेड़ शून्य सशर्त ऑपरेटर (या tuples) का समर्थन नहीं करते हैं।

price = co == null ? 0 : (co.price ?? 0) 

कोड आप का उपयोग करता है List<T> से लिंक

+0

धन्यवाद। आपने मेरे [यह] (https://stackoverflow.com/q/44681042/1232087) 'SO' प्रश्नों का भी उत्तर दिया। – nam

3

:

बस इसे पुराने तरीके से करते हैं (मेरा मानना ​​है कि अशक्त-कोलेसिंग ऑपरेटर एक अभिव्यक्ति पेड़ में ठीक है।)। List<T> लागू IEnumerable<T> लेकिन IQueryable<T> नहीं। उस स्थिति में, प्रक्षेपण स्मृति में ?. कार्यों में निष्पादित किया जाता है।

आप कुछ IQueryable<T> का उपयोग कर रहे हैं, जो बहुत अलग तरीके से काम करता है। IQueryable<T> के लिए, प्रक्षेपण का प्रतिनिधित्व बनाया गया है, और आपका LINQ प्रदाता तय करता है कि रनटाइम पर इसके साथ क्या करना है। पीछे की संगतता कारणों के लिए, ?. का उपयोग यहां नहीं किया जा सकता है।

अपने LINQ प्रदाता के आधार पर, आप सादा . का उपयोग करने में सक्षम हो सकते हैं और अभी भी NullReferenceException नहीं प्राप्त कर सकते हैं।

+0

आपने मेरे [यह] (https://stackoverflow.com/q/44681042/1232087) 'SO' प्रश्न का भी उत्तर दिया। धन्यवाद। – nam

+0

@hvd क्या आप समझा सकते हैं कि पिछली संगतता के लिए यह क्यों आवश्यक है? – jag

+1

@jag सभी LINQ प्रदाताओं जो पहले से ही '?। 'की शुरूआत से पहले बनाए गए थे, किसी भी उचित तरीके से'? 'को संभालने के लिए तैयार नहीं किए गए थे। – hvd

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