繁体   English   中英

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

[英]Moving C# function to expression for use in Entity Framework / SQL Select

我有一些小的C#函数和来自视图的计算cols,我想转移到Expressions,以便它们直接针对本机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);

我希望我理解你的问题,看看这个讨论。 您不需要额外的论证,但如何将事情安排在一起的想法可能适用于您的案例。

如何重用LINQ选择带参数的表达式

private static Expression<Func<Singles, SearchSingles>> CreateSearchSelector()
{
    return s =>
        new SearchSingles
        {
            Foo = foo,
        };
}

// Then use it like this
DataContext.Single.Select(CreateSearchSelector()).ToList();

看看Microsoft.Linq.Translations 它允许您使用表达式树定义属性,然后在查询中使用它们。 对于选择重用,确实LinqKit是你的朋友,或者看看这个答案,如果你真的想了解它是如何工作的:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM