2012-02-14 27 views
6

बेवकूफ सवाल की तरह दिखता है, लेकिन मुझे बस यह नहीं मिला। मेरे इकाई:शून्य के साथ लिंक अभिव्यक्ति

public class Page 
{ 
    public int Id { get; set; } 
    //... 
    public int? ParentId { get; set; } 
} 

नियंत्रक में: उम्मीद

db.Pages.First(x => x.ParentId == null); 

वर्क्स के रूप में (कुछ तत्व देता है)। लेकिन:

int? test = null; 
db.Pages.First(x => x.ParentId == test); 

Sequence contains no elements

मैं क्या याद आती है फेंकता?

+1

क्या आप linq-to-entities का उपयोग कर रहे हैं? एएसपीनेट-एमवीसी के साथ ऐसा करने के लिए कुछ विशिष्ट नहीं है? – gideon

उत्तर

10

मेरा मानना ​​है कि कुछ LINQ प्रदाताओं के साथ नल के आसपास एक विषमता है। प्रयास करें:

var query = db.Pages.First(x => (test != null && x.ParentId == test) || 
           (test == null && x.ParentId == null)); 

वैकल्पिक रूप से, विभिन्न परिस्थितियों के लिए अलग-अलग प्रश्नों का उपयोग:

var query = test == null ? db.Pages.First(x => x.ParentId == null) 
         : db.Pages.First(x => x.ParentId == test); 

मूल रूप से इस वजह से एसक्यूएल असमान रूप में शून्य से व्यवहार करता है अपने आप को, तो:

WHERE X = Y 

अभी भी असफल हो जायेगी यदि एक्स और वाई दोनों शून्य मान हैं। == null भाग का उपयोग करके (शाब्दिक शून्य के साथ) ISNULL या जो भी एसक्यूएल समतुल्य है, रूपांतरण को मजबूर करता है।

मुझे लगता है कि यह एक दर्द है, और किसी और के पास बेहतर कामकाज हो सकता है, लेकिन यह आपको जाने में मदद कर सकता है।

+2

_better workaround_ एक सभ्य LINQ प्रदाता को ले जाएं, एनएच लिंग ... – gdoron

1

प्रयास करें इस (gdoron की टिप्पणी के अनुसार संशोधित किया अब यह वास्तव में क्या गिदोन तैनात है, इसलिए उसके मेरा के बजाय उन्हें स्वीकार करें।):

int? test = null; 
if(test.HasValue) { 
    db.Pages.First(x => x.ParentId == test.Value); 
} else { 
    db.Pages.First(x => x.ParentId == null); 
} 
+2

काम नहीं करेगा। 'मूल्य - यदि HasValue प्रॉपर्टी सत्य है तो वर्तमान Nullable (T) ऑब्जेक्ट का मान। ==> HasValue प्रॉपर्टी गलत होने पर एक अपवाद फेंक दिया जाता है। <== ' – gdoron

+0

हां, संकेत के लिए धन्यवाद। इस समाधान के लिए –

+0

thx, लेकिन मैं सिर्फ LINQ की विषमता को समझना चाहता था – Wonder

2

आप एक समाधान के रूप कुछ इस तरह कर सकता है:

int? test = null; 
if(test.HasValue) { 
db.Pages.First(x => x.ParentId == test.Value); 
} else { 
db.Pages.First(x => x.ParentId == null); 
} 

मैं int? के बाद से संभालने कर रहा हूँ वास्तव में एक Nullable<int> हमारे LINQ करने वाली संस्थाओं प्रदाता चीजों को सही की तुलना नहीं है।

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