Я пытаюсь снова использовать часть запроса, потому что это достаточно сложно, что я хочу стараться избегать дублирования кода.
Кажется, что при вызове любого метода в запросе, Вы заканчиваете с:
LINQ к Объектам не распознает метод {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)
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);
Ваш запрос выглядит для меня почти идеальным. Вы, конечно, можете вызвать 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
(мой был; я не был уверен, случайно ли вы оставили это без внимания или нет).