Как можно повторно использовать запросы Entity Framework (используя методы)? - PullRequest
7 голосов
/ 10 июля 2010

Я пытаюсь повторно использовать часть запроса, потому что он достаточно сложен, и я хочу попытаться избежать дублирования кода.

Похоже, что при вызове любого метода внутри запроса вы получите:

LINQ to Entities не распознает метод {X} метод и этот метод не может быть переведен на магазинное выражение

В идеале я бы хотел использовать:

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

GetConnections - это метод, который выполняет запросы к item. Я пытаюсь повторно использовать (довольно сложный) запрос в GetConnections, но я не уверен, как заставить это работать.

Текущая подпись GetConnections выглядит примерно так:

IQuerable<Connection> GetConnections(MyItem item)

Ответы [ 2 ]

11 голосов
/ 10 июля 2010
Expression<Func<Customer, CustomerWithRecentOrders>>
  GetCustomerWithRecentOrdersSelector()
{
  return c => new CustomerWithRecentOrders()
  {
    Customer = c,
    RecentOrders = c.Orders.Where(o => o.IsRecent)
  };
}

Потом позже ...

var selector = GetCustomerWithRecentOrderSelector();
var q = myContext.Customers
  .Where(c => c.SomeCondition)
  .Select(selector);
0 голосов
/ 10 июля 2010

Ваш запрос выглядит практически идеально для меня. Вы наверняка можете позвонить GetConnections(item) из своего запроса; вызов методов законен. Однако у вас есть другая проблема: члены анонимного типа должны быть созданы с именами членов (без этих имен у вас не будет доступа к ним).

Следующий запрос прекрасно скомпилирован для меня:

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

Обратите внимание на добавление item = и connections = к select.

Обратите внимание, однако, что ваш метод GetConnections (), возможно, должен быть static (мой был; я не был уверен, что вы пропустили это случайно или нет).

...