Hành vi mặc định của FirstOrDefault() khi được sử dụng với LINQ to SQL là gì?
Nó háo hức tính toán kết quả của truy vấn. Cách dễ nhất để suy nghĩ về điều này là nhận ra rằng loại trả về là int
, không phải IEnumerable<int>
mà có thể được hoãn lại cho đến khi GetEnumerator
được gọi, nhưng int
không có cơ chế như vậy.
Phrasing câu hỏi của bạn cho thấy rằng bạn cũng đang hỏi liệu có cách nào để thay đổi hành vi này không. Có, nhưng không trực tiếp thông qua FirstOrDefault
hoặc bất kỳ cơ chế nào trong LINQ. Nhưng bạn có thể hoãn sử dụng Lazy<T>
. Không có trình biên dịch tiện dụng, vì vậy tha thứ cho tôi nếu điều này không biên dịch nhưng nó sẽ giúp bạn rất gần.
Lazy<int> value = new Lazy<int>(
() => {
var query =
from p in context.tableX
select p.Id;
var result = query.FirstOrDefault();
return result;
}
);
if(value.Value > 0) { // execution will be deferred until here
//
}
Chỉ thực thể và 'IEnumerable' được tải xuống. – gdoron