将C#函数移动到表达式以在Entity Framework / SQL Select中使用
作者:互联网
我有一些小的C#函数,并从视图中计算了cols,然后将它们移至“表达式”,以便它们直接针对本机T / SQL中的数据源执行.
我可以在Select中内联执行此操作,但我想将其移至通用功能以进行重用和测试.
var results = context
.Products
.Select(p => new StockDto
{
Stock = p.GoodStock - p.LiveStock // Real version is more complex.
});
我尝试创建一个返回表达式的函数,但是C#尝试分配该表达式而不是表达式的结果,并且无法编译.使用以下Expression变量也不编译.
public static readonly Expression<Func<DataModel.Product, int>> StockLevel =
expr => expr.GoodStock - 10;
我对使用表达式附加到Where子句很熟悉,但是我不知道如何创建一个从select语句返回字符串的Expression.
我想这样做
var results = context
.Products
.Select(p => new StockDto
{
Stock = StockExpression // StockExpression is written in C#
});
LinqKit似乎与使谓词(Where子句)更易于使用有关,我看不到如何编译表达式树.这样做是手工编写复杂的表达式树的唯一方法(我想避免这种情况,因为它掩盖了代码的含义)?
解决方法:
LinqKit应该为您工作.您应该调用Invoke在另一个表达式中使用一个表达式.
您有两个用于“扩展”合并表达式的选项:
您可以在IQueryable上调用AsExpandable,以便它像这样自动“扩展”表达式:
var results = context
.Products
.AsExpandable()
.Select(p => new StockDto
{
Stock = StockLevel.Invoke(p)
});
或者您可以像这样使用它之前手动展开该表达式:
Expression<Func<Product, StockDto>> expression = p => new StockDto
{
Stock = StockLevel.Invoke(p)
};
expression = expression.Expand();
var results = context
.Products
.Select(expression);
标签:expression,c,entity-framework,sql-server,expression-trees 来源: https://codeday.me/bug/20191118/2029227.html