数据库
首页 > 数据库> > 将C#函数移动到表达式以在Entity Framework / SQL Select中使用

将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