2010-11-04 40 views
24

Có sự khác biệt nào giữa hai cách truy vấn ngữ cảnh này không?Khung thực thể .Có phương pháp chaining

Firm firm = base.context.Firms 
      .Where(f => f.SomeId == someId) 
      .Where(f => f.AnotherId == anotherId) 
      .FirstOrDefault(); 

Firm firm = base.context.Firms 
      .Where(f => f.SomeId == someId && f.AnotherId == anotherId) 
      .FirstOrDefault(); 

Dường như chuỗi hoàn toàn tốt để hoàn thành điều kiện VÀ. Tôi không tin rằng bạn có thể chuỗi các câu lệnh OR. Có một lý do để thích cái khác, hoặc các kịch bản khi một cái tốt hơn/hiệu quả hơn?

Trả lời

34

Cả hai đều nên tạo ra kết quả cuối cùng giống nhau (nếu tôi không nhầm) nhưng tôi thấy số thứ hai dễ đọc hơn và hiển thị tốt hơn mục đích ban đầu.


Cập nhật

Tôi chỉ xác nhận tuyên bố trên sử dụng LINQPad. Cả hai truy vấn sẽ, trên thực tế, sản phẩm cùng một SQL.

Ví dụ:

context.SomeTable.Where(c => c.ParentId == null) 
       .Where(c => c.Name.Contains("F")) 
       .Select(c => c.Name); 

Tạo:

SELECT [t0].[Name] 
FROM [SomeTable] AS [t0] 
WHERE ([t0].[Name] LIKE @p0) AND ([t0].[ParentId] IS NULL) 

nào là SQL tương tự được sản xuất bởi:

context.SomeTable.Where(c => c.ParentId == null && c.Name.Contains("F")) 
       .Select(c => c.Name); 



Bạn có thể điều cũng nhỏ gọn hơn một chút (mà tôi thấy thích hợp hơn vì những lý do tương tự như trên):

var firm = base.context.Firms.FirstOrDefault(f => f.SomeId == someId 
                && f.AnotherId == anotherId); 
+1

+1 để dễ đọc – TGnat

+0

+1 cho LinqPad. – Omar

+5

Người đầu tiên dễ đọc nhất đối với tôi. Bạn có thể thấy ngay lập tức có hai điều kiện riêng biệt phải phù hợp và chúng xếp hàng hoàn hảo. Chắc chắn điều thứ hai cũng có hai điều kiện nhưng phải mất thêm giây để phân tích rằng có một && trong dòng. – Ryan

0

Bạn có thể gỡ lỗi thông qua mã và xem SQL được tạo dưới dạng kết quả của từng mã. Tôi sẽ tưởng tượng nó biến thành cùng một truy vấn.

2

tôi đoán là miễn là bạn đang làm việc với trong IQueryable (như các bộ sưu tập hoàn cảnh của bạn có thể), bằng cách sử dụng các phần mở rộng chuỗi so với mệnh đề vị ngữ đầy đủ đạt được điều tương tự. Điều này là do IQueryable cho phép thực thi trì hoãn nên về cơ bản cùng một SQL được tạo ra đằng sau hậu trường.

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