2011-12-15 45 views
8

Ai đó có thể cho tôi biết sự khác biệt của hai câu lệnh LINQ sau đây không?LINQ - Kiểu cú pháp khác nhau, kết quả khác nhau?

var ChkUnique = DB.BusinessFile.FirstOrDefault(c => c.ROCNo == txtBoxID.Text); 

var ChkUnique = from c in DB.BusinessFile 
       where c.ROCNo == (string)txtBoxID.Text 
       select c; 

ChkUnique != null lợi nhuận false cho đầu một khi một trận đấu không thể được tìm thấy và true cho sau này và tôi không thể tìm ra lý do tại sao điều này xảy ra.

Tôi mới tham gia LINQ nên tôi có thể đã bỏ lỡ điều gì đó thực sự cơ bản nhưng điều đó khiến tôi phát điên vào lúc này.

+0

Lưu ý rằng bạn có thể đặt tên thứ hai tương đương với giá trị đầu tiên như sau: 'var ChkUnique = (từ c trong DB.BusinessFile trong đó c.ROCNo == (chuỗi) txtBoxID.Text select c) .FirstOrDefault();' – phoog

Trả lời

10

Mã thứ hai trả về đối tượng đại diện cho truy vấn bạn đang gọi; nó sẽ không bao giờ rỗng. Mặc dù một khi được liệt kê, nó có thể là một bộ sưu tập trống. (Tuy nhiên, vẫn không có giá trị mặc định)

Đầu tiên của bạn đang gọi FirstOrDefault, đó là buộc một kết quả vào một biến duy nhất, trả về null nếu không có kết quả. Nếu bạn đã làm Where thay vì FirstOrDefault, bạn sẽ có kết quả tương tự cả hai lần.

+1

Gotcha! Cảm ơn :) – Permas

+1

Ngoài ra nếu bạn kết thúc sau với cùng một '(từ c trong DB.BusinessFile nơi c.ROCNo == (chuỗi) txtBoxID.Text chọn c) .irstOrDefault()'. Chọn sau khi dễ đọc! – Independent

1

Câu lệnh đầu tiên sử dụng Extension Method và câu lệnh thứ hai là LINQ Query Expression.

Trong phương pháp đầu tiên FirstOrDefault, trả về phần tử đầu tiên của chuỗi hoặc giá trị mặc định nếu chuỗi không chứa phần tử. Ở đây bạn đang làm việc trên các đối tượng để trả về mặc định của bạn là NULL nếu kết quả của bạn không chứa bất kỳ phần tử nào.

Mặt khác, câu lệnh thứ hai của bạn luôn trả về IEnumerable<T> giá trị loại bộ sưu tập và nó sẽ không bao giờ rỗng. chỉ bạn mới có thể kiểm tra xem bộ sưu tập có chứa các mục bằng thuộc tính Count của Bộ sưu tập hay không.

Nếu bạn sử dụng Phương pháp mở rộng .Where() trong báo cáo đầu tiên của bạn thì nó sẽ tương đương với câu lệnh thứ hai.

Kiểm tra các liên kết được chỉ định để biết thông tin chi tiết và sự khác biệt.

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