Ok đây là những phát hiện của tôi sau khi đi qua đầu ra Reflector trong một thời gian. LINQ-to-Đối tượng kết hợp liên tiếp where
vị khi sử dụng WhereArrayIterator
hoặc WhereListIterator
làm cho nó gần như cư xử như & & điều hành, nhưng không phải là chính xác:
Khi bạn sử dụng x.a==1 && x.b==1
mệnh đề where chuyển thành một Func<TSource, bool>
tìm kiếm như thế này:
bool daspredicate(TSource x)
{
return x.a==1 && x.b==1
}
Tuy nhiên, khi bạn sử dụng liên tiếp Điều khoản ở đâu có hình phạt hiệu suất nhỏ, ít nhất là từ khía cạnh không phải của JITted IL.Dưới đây là cách mã trông giống như sau khi kết hợp:
bool predicate1(TSource x)
{
return x.a==1;
}
bool predicate2(TSource x)
{
return x.b==1;
}
bool daspredicate(TSource x)
{
return predicate1(x) && predicate2(x);
}
Như bạn có thể thấy điều này liên quan đến phí gọi điện bổ sung. Điều này có thể khá tốn kém trừ khi JIT nhấn mạnh các chức năng. Tôi chắc chắn rằng nó làm một công việc tốt ở đó nhưng bây giờ chúng ta biết công việc của JIT trở nên dễ dàng hơn nhiều nếu chúng ta kết hợp bản Tuyên Bố của chúng ta, trừ khi cần thiết.
Về phía SQL của sự vật, các truy vấn giống nhau. Ngay cả trước khi thực hiện, trình gỡ lỗi đánh giá đối tượng truy vấn vào cùng một câu lệnh SQL. Tôi không thể đi quá xa trong không gian tên LINQ vì mọi thứ dường như phức tạp hơn nhiều, nhưng vì các truy vấn giống nhau, nên không có hình phạt không giống như ví dụ LINQ-to-objects ở trên.
EDIT: Tôi đã thấy các trường hợp có nhiều câu lệnh dẫn đến truy vấn con lồng nhau trên máy chủ SQL. Tôi nghĩ tốt hơn là nên gắn bó với những câu lệnh duy nhất bất cứ khi nào bạn có thể ở bên an toàn.
Nguồn
2009-11-08 14:35:00
gần như trùng lặp của http://stackoverflow.com/questions/1648730/when-using-linq-what-is-the-difference-between-and-multiple-where-clauses –
Tôi không tìm thấy điều đó trong tìm kiếm nhưng đây là LINQ-to-SQL cụ thể anyway. –
tác động trên LINQ-to-Objects sẽ là hiển nhiên, tuy nhiên LINQ-to-SQL không rõ ràng. –