2009-08-10 30 views
5

chênh lệch giữa hai báo cáo là gì:LINQ: Sự khác nhau giữa 'Chọn c' và 'Chọn mới (c ...'

var result = from c in context.CustomerEntities 
join p in context.ProjectEntities on c.Pk equals p.CustomerPk 
where p.Entered > DateTime.Now.AddDays(-15) 
select c; 

var result = from c in context.CustomerEntities 
join p in context.ProjectEntities on c.Pk equals p.CustomerPk 
where p.Entered > DateTime.Now.AddDays(-15) 
select new (c.Company, c.Entered, c.pk); 

Có bất kỳ vấn đề hiệu suất liên quan trong các báo cáo này (Để đơn giản c chỉ chứa 3 coloums này.)

Trả lời

10

chênh lệch giữa hai báo cáo là gì

Lợi nhuận đầu tiên một chuỗi lọc của đối tượng nguồn gốc/hoàn chỉnh; thứ hai vẫn làm bộ lọc, nhưng trả về một chuỗi của một loại vô danh với chỉ là ba thuộc tính đó.

Có bất kỳ vấn đề hiệu suất liên quan trong các báo cáo

Hiệu suất phụ thuộc vào back-end. Nếu đây là LINQ-to-Objects, sau đó với new {...} bạn đang tạo thêm các đối tượng (các loại ẩn danh) cho mỗi bản ghi, vì vậy có thể có một chi phí rất nhỏ. Tuy nhiên, nếu đây là LINQ-to-SQL, vv (một cơ sở dữ liệu back-end), thì đây có thể là một lợi ích lớn . Trình tạo truy vấn sẽ kiểm tra xem cột nào là cần thiết và sẽ chỉ tìm nạp ba cột trong loại anon của bạn; nếu bạn có (ví dụ) BLOB (hoặc chỉ dài varchar) trong dữ liệu mà bạn không cần, đây có thể là lợi ích lớn.

Ghi chú thêm: bạn không thể bao gồm các loại vô danh trong chữ ký của một phương pháp, vì vậy bạn có thể tìm thấy bạn cần phải khai báo kiểu DTO của riêng bạn cho mục đích này:

return new CustomerDto { Company = c.Company, Entered = c.Entered, PK = c.pk}; 
... 
public class CustomerDto { ... } 
+1

+1 cho câu trả lời chung chung, nhưng trong tình huống của mình, anh ấy vẫn trả về tất cả các cột. – cjk

+0

Có đúng là tôi đang trả về tất cả các cột. – Waheed

1

Nếu nghi ngờ, hồ sơ.

Nhưng có, tôi nghĩ rằng có chi phí hiệu năng. Nếu bạn làm select c thì bộ sưu tập sẽ chứa tham chiếu đến các mục gốc. Nếu bạn thực hiện select new { ... } thì C# đang tạo một loại ẩn danh cho bạn, tạo các phiên bản mới của loại đó và điền chúng với dữ liệu. Âm thanh chắc chắn chậm hơn với tôi.

+0

+1 để giới thiệu hồ sơ. – Marcel

2

Sự khác biệt chính là ví dụ đầu tiên trả về các tham chiếu đến các cá thể hiện có trong khi ví dụ thứ hai tạo ra các cá thể mới của một kiểu ẩn danh. Tôi sẽ quan tâm nhiều hơn đến vấn đề này hơn bất kỳ vấn đề hiệu suất nào có thể xảy ra.

2

Tôi chạy một số xét nghiệm (sử dụng Đồng hồ bấm giờ). Trong mọi trường hợp, các loại vô danh nhanh hơn, trong LINQ-to-SQL (chống lại SQL Server), LINQ-to-Entities (chống lại MySQL), và LINQ-to-Objects (chống lại một List). Trong thực tế, thông thường nó chậm hơn, tùy thuộc vào số lượng cột bạn chọn.

Một trong các kết quả của tôi: Tôi chạy mỗi truy vấn 5000 lần so với bảng 5 cột được điền bởi 400 hàng với LINQ-to-Entities.

đối tượng ẩn danh (chọn 1 cột): 17314ms

đối tượng ẩn danh (chọn 5 cột): 19193ms đối tượng

nguồn: 16055ms

Dù sao, cách tốt nhất để tìm hiểu là để kiểm tra nó chính bạn (mất khoảng thời gian để viết một bài tốt).

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