2012-06-21 24 views
12

Sau khi đọc this câu hỏi, Tôi cần làm sáng tỏ một số điều.IEnumerable <T> và IQueryable <T> làm rõ?

IQueryable<Customer> custs = from c in db.Customers 
where c.City == "<City>" 
select c; 

IEnumerable<Customer> custs = from c in db.Customers 
where c.City == "<City>" 
select c; 

Câu hỏi:

1) Is it ok để nói rằng: trong truy vấn đầu tiên trên SQLServer đang chạy toàn bộ hoạt động bao gồm cả khoản ở đâu và trở CHỈ các hàng có liên quan - trong khi cái thứ hai làm SELECT * ... và trả lại tất cả hàng vào bộ lọc C# và THEN?

2) Nếu tôi có bộ sưu tập chỉ đơn thuần là - trong bộ nhớ. (var lstMyPerson = new List<MyPerson>())

IQueryable<MyPerson> lst = from c in lstMyPerson 
where c.City == "<City>" 
select c; 

vs

IEnumerable<MyPerson> custs = from c in lstMyPerson 
where c.City == "<City>" 
select c; 

những gì sẽ là sự khác biệt trong thực hiện bây giờ?

+0

Hãy xem chủ đề có liên quan này: http://stackoverflow.com/questions/252785/what-is-the-difference-between-iqueryablet-and-ienumerablet. Và ngoài ra, bạn đúng trong giả định của bạn ở # 1. Không chắc chắn 100% về # 2 vì vậy tôi sẽ để nó cho người khác. – blizz

+0

@ blizz tôi đã đọc rồi. tất cả các câu trả lời có từ một cuốn sách POV. không có gì trả lời câu hỏi của tôi ở đó ....: (... bị bệnh ** hạnh phúc ** để xem dòng nào trả lời câu hỏi của tôi –

Trả lời

29

1: Không, đó là không chính xác

Vì bạn đang chỉ lưu trữ kết quả vào một IEnumerable<Customer>, nhưng vẫn có biểu hiện chính xác cùng sản xuất kết quả, cả hai sẽ thực hiện trên máy chủ và chỉ trả lại các hàng có liên quan.

Bạn sẽ nhận được sự khác biệt trong hành vi với điều này:

IEnumerable<Customer> custs = from c in (IEnumerable<Customer>)db.Customers 
    where c. City == "<City>" 
    select c; 

Trong trường hợp này bạn đang buộc thu db.Customers được sử dụng như IEnumerable<T>, mà khi được liệt kê sẽ lấy toàn bộ bộ sưu tập.

Lưu ý rằng đây:

IEnumerable<Customer> x = from c in db.Customers 
          where c.City == "<City>" 
          select c; 

không giống như thế này:

IEnumerable<Customer> x = from c in db.Customers 
          select c; 
IEnumerable<Customer> y = x.Where(c => c.City == "<City>"); 

Trong trường hợp đầu tiên, mệnh đề where sẽ là một phần của SQL, trong lần thứ hai nó đã giành 't. Đó là lý do tại sao câu hỏi/câu trả lời liên quan đến sự khác biệt, trong khi mã của bạn thì không.

Cũng lưu ý rằng chỉ các báo cáo bạn đã viết sẽ không thực sự thực thi bất kỳ thứ gì trên máy chủ, vì chúng sẽ chỉ lưu trữ một bộ sưu tập lười biếng. Nếu bạn tiếp tục và liệt kê các bộ sưu tập đó, tại thời điểm đó các bit có liên quan sẽ được thực thi trên máy chủ.

2: List<T> không thực hiện hoặc có phương pháp khuyến nông cho IQueryable<T>, cũng không phải các nhà khai thác LINQ sẽ tham gia trở lại bất cứ điều gì tương thích với IQueryable<T>

Trong trường hợp này, người đầu tiên sẽ không biên dịch.

+0

vì vậy (trong liên kết của tôi) driis có sai trong câu trả lời của mình? –

+0

Không, như tôi đã nói, họ Tuy nhiên, trong trường hợp mã được liên kết, toán tử LINQ 'Where' được áp dụng cho' IEnumerable 'hoặc' IQueryable ', bạn đã thêm mệnh đề' where' vào truy vấn ban đầu. Điều này thay đổi thứ tự của các hoạt động, do đó, trong trường hợp của bạn, chúng sẽ thực hiện theo cùng một cách.Trong câu trả lời được liên kết, chúng sẽ không bị –

+0

liên quan đến _forcing bộ sưu tập db.Customers được sử dụng như IEnumerable , khi được liệt kê sẽ tìm nạp toàn bộ collection_, nếu tôi hiểu chính xác, mã này sẽ nhận được TẤT CẢ KHÁCH HÀNG và THEN Lọc? –