2011-08-16 29 views
5

Parent_ObjectiveIDidentityint? kiểu dữ liệu. Trong chương trình của tôi nên trả về một đối tượng, nhưng nó đưa ra một lỗi: Sequence contains no elements.Các vấn đề với các loại có thể vô hiệu hóa trong một Hàm LINQ

int? identity = null; 

Objective currentObjective = (from p in cd.Objective 
           where p.Parent_ObjectiveID == identity 
           select p).Single(); 

Mặc dù, nếu tôi thay thế biến số nhận dạng thành rỗng. Nó hoạt động, nhưng tôi không hiểu.

currentObjective = (from p in cd.Objective 
        where p.Parent_ObjectiveID == null 
        select p).Single(); 

Điều gì đang xảy ra?

UPDATE 1:

Tôi đã làm điều này:

if (identity == null) 
{ 
    currentObjective = (from p in cd.Objective 
         where p.Parent_ObjectiveID == null 
         select p).Single(); 
} 
else 
{ 
    currentObjective = (from p in cd.Objective 
         where p.Parent_ObjectiveID == identity 
         select p).Single(); 
} 

Nhưng tôi không thực sự thích nó.

+0

Bạn đang nói về Linq-To-Sql hoặc LINQ-To-Objects? Tôi chỉ thử nghiệm này với LINQ-To-Objects, và nó làm việc cho tôi. (.NET 4.0) – magnattic

+0

@atticae LINQ to SQL –

+0

Tại sao bạn gắn thẻ nó với 'linq-to-objects'? ;) – magnattic

Trả lời

1

LINQ dường như không hỗ trợ trường hợp này trong mệnh đề where.

This question có cùng vấn đề. Xem thêm this thread.

Bạn có thể thử:

Objective currentObjective = (from p in cd.Objective 
            where p.Parent_ObjectiveID == (identity ?? null) 
            select p).Single(); 

EDIT: Nếu điều này không làm việc, hãy thử để so sánh với Object.equals:

Objective currentObjective = (from p in cd.Objective 
            where object.Equals(p.Parent_ObjectiveID, identity) 
            select p).Single(); 
+0

Tôi chưa nhận được nó –

+0

xem chỉnh sửa của tôi, điều này sẽ làm việc – magnattic

+0

Mã đầu tiên sẽ hoạt động, mặc dù nó trả về một (int?) null và để làm việc nó sẽ chỉ là null. Có lẽ tôi nên làm việc với Trường hợp claussule và biểu thức để loại bỏ siêu nếu –

0

tôi thấy một bài viết tại LINQ to SQL Null check in Where Clause giải thích vấn đề này. Dường như bạn có thể sử dụng thay vì object.Equals:

from p in cd.Objective 
where object.Equals(p.Parent_ObjectiveID, identity) 
select p 
+0

Nó không làm việc ra Jacob –

0
from p in cd.Objective 
where p.Parent_ObjectiveID == identity 
select p 

sẽ được biên dịch để 'select * from khách quan nơi Parent_ObjectiveID == @identity'. Và,

from p in cd.Objective 
where p.Parent_ObjectiveID == null 
select p 

sẽ được biên dịch để 'select * from khách quan nơi Parent_ObjectiveID là null'.

Điều khoản 'trong đó Parent_ObjectiveID == null' sẽ luôn trả về 'false' khi @identity của bạn rỗng.

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