2012-02-14 23 views
6

Aptalca bir soru gibi görünüyor, ama anlayamıyorum. Benim varlık: denetleyici olarakNull ile Linq ifadesi

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

: beklenen

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

İşleri olarak (bazı elemanını döndürür). Ama:

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

Sequence contains no elements

Ben neyi özlüyorsun Atar?

+1

Linq-to-entities kullanıyor musunuz? Bunun asp.net-mvc ile ilgisi yok mu? – gideon

cevap

10

Bazı LINQ sağlayıcılarıyla boş değerlerin etrafında bir gariplik olduğuna inanıyorum. Deneyin:

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

Alternatif farklı durumlar için farklı sorguları kullanın:

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

Temelde bu SQL kendisine eşitsiz olarak NULL davranır çünkü, bu yüzden:

WHERE X = Y 

hala başarısız olur Hem X hem de Y boş değerlerdir. == null bölümünü (literal boş) kullanarak, bir dönüşümü ISNULL'a veya SQL eşdeğeri ne olursa olsun zorlar.

Bunun bir acı olduğuna katılıyorum ve başka birisinin daha iyi bir çözümü olabilir, ancak bu devam etmenize yardımcı olabilir.

+2

_better workaround_ İyi bir LINQ sağlayıcısına geçin, ling NH ... – gdoron

1

bu deneyin (Şimdi Gideon yayınlanmıştır tam olarak ne gdoron yorumuna göre modifiye yüzden onun yerine mayın arasında kabul edin.):

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

Çalışmayacaksınız. 'Değer - HasValue özelliği true ise geçerli Nullable (Of T) nesnesinin değeri. ==> HasValue özelliği false olursa bir istisna atılır. <== ' – gdoron

+0

Evet, ipucu için teşekkürler. Bu çözüm için –

+0

thx, ama sadece LINQ tuhaflığını anlamak istedim – Wonder

2

Bir çözüm olarak böyle bir şey yapabileceğini:

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

aslında Nullable<int> bizim linq-to-kuruluşlar sağlayıcı doğru şeyler karşılaştırarak değil mi.