2013-05-31 25 views

Trả lời

10

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>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 
    // 
} 
+0

Nếu đối tượng IEnumerable của nó hơn cách FirstOrDefault() sẽ hoạt động ??? –

+1

@Iti Tyagi - Có vẻ như bạn đang hỏi liệu FirstOrDefault() có bắt đầu một cuộc gọi đến GetEnumerator hay không. Truy vấn.FirstOrDefault() dẫn đến tải chậm hoặc tải mong muốn (tức là nó sẽ gọi GetEnumerator hay không)? Tôi tin rằng một cái gì đó như query.ToList() sẽ buộc một tải mong muốn - sẽ FirstOrDefault() làm như vậy? –

2

tải Háo hức!

Nếu bạn nghĩ về nó, nó chỉ trả về một số đơn giản int - một int không thể đại diện cho "một cách để đi và nhận được int". (Đó là những gì Lazy<int> là dành cho ...)

8

Tất cả các nhà khai thác LINQ tiêu chuẩn, mà trở duy nhất, không đếm được kết quả, được thực hiện ngay lập tức tại điểm mà truy vấn là tuyên bố. Vì vậy, FirstOrDefault, Count, Sum và các toán tử khác trả về một giá trị được thực thi ngay lập tức.

Đây là đẹp MSDN bài viết Classification of Standard Query Operators by Manner of Execution

2

Nó trở tải háo hức khi bạn sử dụng phương pháp khuyến nông trên result.If đếm được bạn không sử dụng những phương pháp mở rộng nó sẽ được tải Lazy và bạn có thể không thực sự lấy các giá trị cho đến khi bạn liệt kê thông qua kết quả LINQ

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