2011-09-30 34 views
6

Hy vọng rằng đây là một vấn đề đơn giản của tôi không hiểu cái gì cơ bản. Dưới đây là hai câu lệnh LINQ từ một ứng dụng tôi đang làm việc.LINQ, OrderByDescending, Đầu tiên, và DefaultIfEmpty bất chính

EDMXModel.Classes.Period p1 = entities.Periods.DefaultIfEmpty(null).OrderByDescending(ap => ap.UID).First(); 

EDMXModel.Classes.Period p2 = entities.Periods.OrderByDescending(ap => ap.UID).DefaultIfEmpty(null).First(); 

entity.Periods là tập hợp chứa hai đối tượng Period, mỗi đối tượng có unique UID.

Theo mọi thứ tôi hiểu, p1 và p2 phải giống nhau.

Tuy nhiên, trong môi trường của tôi thì không.

p1 là chính xác (tức là nó bằng với đối tượng Period có UID lớn nhất trong tập hợp). Tuy nhiên,

p2 không đúng (nghĩa là nó bằng với khoảng thời gian khác trong tập hợp).

Bất kỳ ý tưởng nào?

Trả lời

8

DefaultIfEmpty() trên LINQ to Entities không đảm bảo để duy trì trật tự được thiết lập bởi OrderByDescending(), (xem thêm here) thứ tự nên thường xuyên phải xuống hàng chót và đó là lý do tại sao trường hợp đầu tiên hoạt động - nhưng bạn không nên sử dụng hoặc theo ý kiến ​​của tôi - đây chính xác là những gì FirstOrDefault() là dành cho:

EDMXModel.Classes.Period p1 = entities.Periods 
             .OrderByDescending(ap => ap.UID) 
             .FirstOrDefault(); 
Các vấn đề liên quan