2012-02-14 33 views
6

Trông giống như câu hỏi ngu ngốc, nhưng tôi không hiểu. thực thể của tôi:Biểu thức LINQ với giá trị rỗng

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

Trong điều khiển:

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

trình như mong đợi (trả về một số nguyên tố). Nhưng:

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

Ném Sequence contains no elements

làm tôi nhớ gì?

+1

Bạn đang sử dụng LINQ-to-thực thể? Điều này không có gì cụ thể để làm với asp.net-MVC? – gideon

Trả lời

10

Tôi tin rằng có một sự kỳ quặc xung quanh null với một số nhà cung cấp LINQ. Hãy thử:

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

Ngoài ra, sử dụng các truy vấn khác nhau cho các tình huống khác nhau:

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

Về cơ bản điều này là do SQL đối xử với NULL như bất bình đẳng với chính nó, vì vậy:

WHERE X = Y 

vẫn sẽ thất bại nếu cả X và Y là giá trị null. Sử dụng phần == null (với chữ số null) buộc chuyển đổi thành ISNULL hoặc bất kỳ giá trị tương đương SQL nào.

Tôi đồng ý đó là một nỗi đau và một người khác có thể giải quyết tốt hơn, nhưng điều này có thể giúp bạn tiếp tục.

+2

_bộ phận làm việc tốt hơn_ Di chuyển đến nhà cung cấp LINQ phong nha, ling NH ... – gdoron

1

Hãy thử điều này (sửa đổi theo bình luận gdoron bây giờ Đó là chính xác những gì gideon đăng, vì vậy hãy chấp nhận mình thay vì tôi.):

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

Sẽ không hoạt động. 'Giá trị - Giá trị của đối tượng Nullable (Of T) hiện tại nếu thuộc tính HasValue là true. ==> Một ngoại lệ được ném nếu thuộc tính HasValue là sai. <== ' – gdoron

+0

Có, cảm ơn gợi ý. –

+0

thx cho giải pháp này, nhưng tôi chỉ muốn hiểu rằng sự kỳ quặc của LINQ – Wonder

2

Bạn có thể làm một cái gì đó như thế này như một cách giải quyết:

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

Tôi giả định là int? thực sự là một nhà cung cấp dịch vụ LINQ-to-entity không so sánh đúng thứ.

Các vấn đề liên quan