Tôi có người dùng tìm kiếm các bản ghi loại Record. Họ nhập cụm từ tìm kiếm vào hộp văn bản và sau đó tôi tìm kiếm các bản ghi bằng cách khớp một vài trường với cụm từ tìm kiếm.Cách sử dụng lại các mệnh đề trong các truy vấn LINQ To Sql
truy vấn của tôi trông giống như:
var results = from record in DataContext.Records
where
record.Field1.ToLower().Contains(term) ||
record.Field2.ToLower().Contains(term) ||
record.Field3.ToLower().Contains(term)
select record;
Tôi có một số thắc mắc rằng tất cả sử dụng bộ lọc tương tự và do đó tôi muốn trích xuất các bộ lọc để nó có thể được tái sử dụng. Một cái gì đó như:
var filter = new Func<Record, string, bool>(
(record, term) =>
record.Field1.ToLower().Contains(term) ||
record.Field2.ToLower().Contains(term) ||
record.Field3.ToLower().Contains(term)
);
var results = from record in DataContext.Records
where filter(record, term)
select record;
Tuy nhiên, nó không hoạt động vì:
Phương pháp 'System.Object DynamicInvoke (System.Object []) không có bản dịch được hỗ trợ để SQL.
Làm cách nào để tôi có thể sử dụng lại trạng thái của mình trong các truy vấn?
Tôi không nghĩ rằng điều này sẽ làm việc như bằng văn bản - CQ.Compile tạo ra một Func để nó không thể được sử dụng trong mệnh đề Where của một truy vấn LINQ to SQL. Bạn không cần một cái gì đó như 'var query = CompiledQuery.Compile ((string term) => from r trong DataContext.Records trong đó r.Field1.ToLower(). Chứa (term) select r);' then 'var results = truy vấn ("someTerm"); '? Đã không sử dụng CompiledQuery vì vậy tôi có thể sai! – itowlson
@ itowlson: Nó hoạt động. Đây là cách bạn tạo các hàm có thể sử dụng lại có thể sử dụng trong LINQ to SQL. Nhà cung cấp truy vấn sẽ nhận ra hàm được biên dịch và sẽ tạo truy vấn nếu cần. Nó không chỉ tạo ra các truy vấn đầy đủ, nhưng nó cũng có thể tạo ra các phần truy vấn (chẳng hạn như điều kiện này). –
Điều này hoạt động như mong đợi. Điều kỳ lạ duy nhất là tôi cũng tái sử dụng bộ lọc đó trong các truy vấn LINQ To Object, và sau đó tôi vẫn phải chuyển LINQ To Sql DataContext làm tham số. Bất kỳ cách nào để xác định truy vấn độc lập với DataContext? –