context.Customer
.AsEnumerable() // because the method has no translation to SQL
.Where(customer => (GetAge(customer.BirthDate) > 20 && customer.AccountType == "Savings")
|| (GetAge(customer.BirthDate) > 40 && customer.AccountType == "Current"));
Các .AsEnumerable
là cần thiết nếu bạn đang cố gắng để truy vấn một cơ sở dữ liệu SQL như là phương pháp getAge trong mã của bạn sẽ không có dịch để SQL. Trong trường hợp đó, lệnh gọi tới số .AsEnumerable
truy xuất kết quả truy vấn đến thời điểm đó và sau đó bạn làm việc với các đối tượng địa phương mà phương pháp của bạn có thể hoạt động.
Nếu bạn không muốn truy xuất tất cả kết quả tại thời điểm đó vì số lượng bản ghi lớn, bạn luôn có thể sao chép logic từ phương thức bạn muốn gọi trong truy vấn của mình (tôi đoán logic ở đây):
context.Customer.Select(c => new { Customer = c, Age = (DateTime.Today.Year - c.BirthDate.Year) }
.Where(c => (c.Age > 20 && c.Customer.AccountType == "Savings")
|| (c.Age > 40 && c.Customer.AccountType == "Current"))
.Select(c => c.Customer);
Bởi vì các thao tác đều có sẵn trong SQL, thao tác này sẽ hoạt động.
Nếu phương pháp bạn đang cố gắng gọi đặc biệt phức tạp, bạn luôn có thể di chuyển nó sang phương thức tiện ích có số IQueryable
và trả lại IQueryable
. Nội dung của phương thức vẫn sẽ cần phải có một bản dịch hợp lệ cho SQL nhưng nó sẽ giúp ẩn logic phức tạp hơn.
Ví dụ truy vấn trên có thể được thực hiện để trông như thế này:
context.Customers.WhoAreValidByAge();
đâu WhoAreValidByAge
được định nghĩa là:
public static IQueryable<Customer> WhoAreValidByAge(this IQueryable<Customer> customers)
{
cusomters.Select(c => new { Customer = c, Age = (DateTime.Today.Year - c.BirthDate.Year) }
.Where(c => (c.Age > 20 && c.Customer.AccountType == "Savings")
|| (c.Age > 40 && c.Customer.AccountType == "Current"))
.Select(c => c.Customer)
}
Nếu logic chứa trong phương pháp của bạn không dịch để SQL vì một số lý do mặc dù bạn không có lựa chọn nào khác ngoài việc chuyển đổi các kết quả thành LinqToObjects. Trong trường hợp đó, tôi khuyên bạn nên lọc kết quả càng nhiều càng tốt trong SQL trước khi gọi AsEnumerable
.
Nguồn
2010-11-03 09:33:46
Đây có phải là LINQ to SQL không? – Ani
Đây là LINQ đối với thực thể. Tôi đang sử dụng khung Entity. –