Tôi cố gắng để hiểu một số hàm ý thực hiện LINQ từ ebook miễn phí này bằng cách RedGate ftp://support.red-gate.com/ebooks/under-the-hood-of-net-memory-management-part1.pdfCó thể gọi phương thức có tên trong cuộc gọi đến đâu không?
Trên trang 157-158 trong cuốn sách này, họ đã tạo ra theo gương.
Order[] pastDueAccounts = null;
DateTimedueDate = DateTime.Today.AddDays(-7);
using(varcontext = new Context())
{
pastDueAccounts = context.Accounts.Where(account => account.DueDate < dueDate).ToArray();
}
Sau đó, họ tính lại một phần biểu thức lamda thành hàm sau.
public bool PastDueAccount(Account account)
{
return account.DueDate < DateTime.Today.AddDays(-7);
}
Cuối cùng, họ đã sử dụng chức năng này như sau.
Order[] pastDueAccounts = null;
using(varcontext = new Context())
{
pastDueAccounts = context.Accounts.Where(account => PastDueAccount(account)).ToArray();
}
Dựa trên những gì tôi đã nghiên cứu cho đến nay, không thể nhận truy vấn LINQ này là LINQ sẽ không thể dịch thành biểu thức cửa hàng. Tôi tự hỏi nếu ví dụ này là sai và chỉ đơn giản là không thể chạy hoặc nếu tôi chỉ có thời gian khó khăn nhận được nghe nói của tôi xung quanh về cách mô phỏng vấn đề này?
Điều này là sai và sẽ không hoạt động vì đây không phải là biểu thức lambda và không thể được nhà cung cấp truy vấn đánh giá. – casperOne
Tôi thực sự đã làm việc này chống lại thiết lập EF mà tôi có. – Gromer
Nếu nó đang hoạt động, bạn đang lọc * trên máy khách * và cuộc gọi đến 'Where' đang đánh giá kết quả từ' IEnumerable 'và * không * dịch bộ lọc sang phía máy chủ. Hãy nhớ rằng, 'IQueryable ' có nguồn gốc từ 'IEnumerable ', vì vậy tất cả các phương thức mở rộng trên' IEnumerable 'sẽ hoạt động trên' IQueryable 'và nó không phải lúc nào cũng rõ ràng. –
casperOne