У меня есть этот фрагмент кода LINQ
private static void Original()
{
using (var context = new AdventureWorksContext())
{
var result =
from product in context.Products
from workorder in product.WorkOrders
select new
{
productName = product.Name,
order = workorder,
};
var result2 =
from item in result
where item.order.WorkOrderRoutings.Count() == 1
select item.productName;
foreach (var item in result2.Take(10))
{
Console.WriteLine(item);
}
}
}
Я хочу выделить часть item.order.WorkOrderRoutings.Count()
и заменить ее чем-то другим, например item.order.OrderQty
на основе некоторого входного параметра.
Моя первая попытка:
private static Func<WorkOrder, int> GetRoutingCountFunc()
{
return workOrder => workOrder.WorkOrderRoutings.Count();
}
private static void RefactoredFunc()
{
using (var context = new AdventureWorksContext())
{
var result =
from product in context.Products
from workorder in product.WorkOrders
select new
{
productName = product.Name,
order = workorder,
};
var result2 =
from item in result
where GetRoutingCountFunc()(item.order) == 1
select item.productName;
foreach (var item in result2.Take(10))
{
Console.WriteLine(item);
}
}
}
, конечно, происходит сбой среды выполнения с исключением
Метод 'System.Object DynamicInvoke (System.Object [])' не поддерживает перевод наSQL.
Итак, я понял, что мне нужно вставить что-то вроде Expression
.Самое разумное, что я могу выяснить, это
private static Expression<Func<WorkOrder, int>> GetRoutingCountExpression()
{
return workOrder => workOrder.WorkOrderRoutings.Count();
}
private static void RefactoredExpression()
{
using (var context = new AdventureWorksContext())
{
var result =
from product in context.Products
from workorder in product.WorkOrders
select new
{
productName = product.Name,
order = workorder,
};
var result2 =
from item in result
where GetRoutingCountExpression()(item.order) == 0
select item.productName;
foreach (var item in result2.Take(10))
{
Console.WriteLine(item);
}
}
}
Но это дает ошибку времени компиляции: «Ожидается имя метода» в строке where GetRoutingCountExpression()(item.order) == 0
.
Если это не дляанонимный тип Я мог бы создать метод, возвращающий Expression<Func<"anonType", bool>>
, и использовать его в качестве аргумента where.
Как мне выделить части выражения LINQ?