7

Tôi đang cố gắng sử dụng lại một phần truy vấn, vì nó phức tạp đến nỗi tôi muốn cố gắng tránh trùng lặp mã.Làm cách nào để có thể sử dụng lại các truy vấn Khung thực thể (sử dụng các phương pháp)?

Dường như khi gọi bất kỳ phương pháp bên trong một truy vấn, bạn kết thúc với:

LINQ to Entities không nhận phương pháp {X} phương pháp, và phương pháp này không thể được dịch ra tiếng một cửa hàng biểu

Những gì tôi muốn làm lý tưởng là sử dụng:

var q = from item in context.Items 
     where item.SomeCondition == true 
     select new {Item = item, Connections = GetConnections(item)}; 

GetConnections là phương pháp thực hiện truy vấn trên item. Tôi đang cố gắng tái sử dụng truy vấn (khá phức tạp) trong GetConnections, nhưng tôi không chắc chắn làm thế nào để có được điều này để làm việc.

chữ ký hiện tại của GetConnections là một cái gì đó như:

IQuerable<Connection> GetConnections(MyItem item) 

Trả lời

11
Expression<Func<Customer, CustomerWithRecentOrders>> 
    GetCustomerWithRecentOrdersSelector() 
{ 
    return c => new CustomerWithRecentOrders() 
    { 
    Customer = c, 
    RecentOrders = c.Orders.Where(o => o.IsRecent) 
    }; 
} 

Rồi sau đó ...

var selector = GetCustomerWithRecentOrderSelector(); 
var q = myContext.Customers 
    .Where(c => c.SomeCondition) 
    .Select(selector); 
+1

Bất kỳ ý tưởng nào cũng làm như vậy khi bạn không có 'IQuerable ' nhưng chỉ là 'Khách hàng '? Điều đó thậm chí có thể? –

+0

CustomerWithRecentOrders x = myContext.Customers .Where (c => c == myCustomer) .Chọn (bộ chọn) .Single() –

-1

truy vấn của bạn trông gần như hoàn hảo đối với tôi. Bạn chắc chắn có thể gọi GetConnections(item) từ bên trong bạn truy vấn; các phương pháp gọi là hợp pháp. Tuy nhiên, bạn có một vấn đề khác: Thành viên kiểu ẩn danh phải được tạo với tên thành viên (không có tên đó, bạn sẽ không có cách nào để truy cập chúng).

Truy vấn sau biên dịch tốt cho tôi:

var q = from item in context.Items 
     where item.SomeCondition == true 
     select new {item = item, connections = GetConnections(item)}; 

Lưu ý việc bổ sung các item =connections = đến select.

Xin lưu ý rằng phương thức GetConnections() của bạn có thể cần phải là static (của tôi là; tôi không chắc liệu bạn có vô tình vô tình hay không).

+0

Nó không phải là biên soạn thất bại, đó là thực hiện. Tôi đã không sao chép/dán mã vào, nhưng gõ nó bằng đầu thay vào đó, đó là lý do tại sao tôi quên các thành viên kiểu vô danh –