的部分跳出LINQ2SQL表达
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
取代我有这段代码LINQ。
我第一次尝试:
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);
}
}
}
当然
失败,运行时有异常
Method 'System.Object DynamicInvoke(System.Object[])' has no supported translation to 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表达式?
http://www.albahari.com /nutshell/predicatebuilder.aspx你可以试试这个方向 –
+1为Adrian Iftodes回答。我有完全相同的问题,并最终使用了解决我的问题的谓词构建器。 – wasatz