2013-01-23 34 views
5

Tôi đang học C# (nền trong C++) và tôi có câu hỏi về các biểu thức LINQ. Cả hai chức năng sau đều làm điều tương tự (gần như tôi có thể nói). Loại Wombats là System.Data.Linq.Table<Wombat>.So sánh hiệu quả của hai câu lệnh LINQ khác nhau

tôi quan tâm để biết

  1. Đó là hiệu quả hơn?
  2. Liệu nó có quan trọng không?
  3. Có điều gì để đạt được bằng cách trả lại IQueryqble, thay vào đó?
  4. Có một số nghi thức ở đây thích một trong ba điều không?

Tôi đoán là điều thứ hai hiệu quả hơn, nhưng điều đó không quan trọng trừ khi có hàng triệu wombat trong bảng wombat. Và trả lại một IQueryable dường như không quan trọng nhiều vì chúng ta chỉ quay trở lại một con gấu đơn.

Cảm ơn trước!

public static DBConnector.Connections.Wombat getWombat(String wombatID) 
    { 
     var db = getDBInstance(); 
     return db.Wombats.FirstOrDefault(x => x.ID.ToString() == wombatID); 
    } 

    public static DBConnector.Connections.Wombat getWombat(String wombatID) 
    { 
     var db = getDBInstance(); 
     var guid = new System.Guid(wombatID); 
     return db.Wombats.FirstOrDefault(x => x.ID == guid); 
    } 
+9

Tôi chắc chắn bạn có nghĩa là '== guid' trong ví dụ thứ hai của bạn –

+1

Tại thời điểm này, bạn nên hỏi về hiệu quả của' LINQ to SQL', có vẻ như bạn đang sử dụng. –

+0

@lc. Tôi --- Tôi đã chỉnh sửa tên biến và phải bỏ lỡ điều này. – BenDundee

Trả lời

7

Điều này sẽ phụ thuộc hoàn toàn vào nhà cung cấp LINQ của DB và cách biến nó thành SQL. Bạn có thể profile the resulting SQL (hoặc thậm chí chỉ inspecting the SQL trace) và xác định cái nào hiệu quả hơn.

Tôi nghi ngờ rằng hầu hết các nhà cung cấp sẽ làm tốt hơn với tùy chọn thứ hai, vì kiểm tra thực tế sẽ cùng loại - truy vấn trên máy chủ sẽ không cần phải chuyển đổi từng hàng thành chuỗi và so sánh thông qua so sánh chuỗi. Điều này có khả năng sẽ cho phép lập chỉ mục hoạt động bình thường và làm cho nó hoạt động hiệu quả hơn nhiều. Điều đó đang được nói, một nhà cung cấp thông minh có thể thực hiện chuyển đổi này cho bạn, trong trường hợp đó, hai tùy chọn có thể giống hệt nhau.

1

Nếu bạn trả lại IQuerable, bạn có thể trì hoãn việc cho phép người khác cập nhật giá trị trước tiên.

+0

Ahh điểm tốt. Tôi không nghĩ rằng tôi phải lo lắng về điều này ở đây, nhưng chắc chắn một cái gì đó để ghi nhớ trong tương lai. – BenDundee

5

Đoán của bạn là đúng, truy vấn thứ hai có khả năng hiệu quả hơn, vì nó sẽ phân tích GUID một lần thay vì chuyển đổi GUID trong mỗi hàng thành một chuỗi. Nhà cung cấp truy vấn có thể tối ưu hóa điều này, nhưng nó không phải; nó cũng có thể là nhà cung cấp truy vấn của bạn sẽ chọn chuyển đổi GUID thành chuỗi để so sánh, nhưng đó sẽ là một lựa chọn khá đáng tiếc.

Bạn cũng đúng với giả định rằng nó sẽ không quan trọng trừ khi có một số lượng đáng kể các đối tượng Wombat trong bảng.

Có một sự khác biệt đáng kể có lợi cho truy vấn thứ hai: phương thức ToString có thể không được nhà cung cấp truy vấn nhận dạng, vì vậy truy vấn đầu tiên của bạn thậm chí sẽ không thực thi do lỗi thời gian chạy.

+5

Tùy thuộc vào những gì nhà cung cấp truy vấn thực hiện. Hãy nhớ rằng đây là một 'IQueryable ' - nó không giống như mã * như được viết * sẽ được thực hiện. –

3
  1. Xem sql được tạo cho từng trường hợp.
  2. Kiểm tra thời gian thực hiện, kế hoạch truy vấn và IO của từng truy vấn trong studio sql.
  3. ???
  4. Lợi nhuận.
+1

+1 cho lợi nhuận ... – BenDundee

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