在linq查询中使用外部表达式

时间:2018-01-04 11:00:23

标签: linq-to-sql

我需要使用在查询之外定义的表达式。此表达式将用于许多其他查询中,因此我想重用它。

这是一个简单的例子来说明。

repos.ItemDocumentoProprio.Select(s => new SaleDto {
    Total = s.Total,
    TotalSale = s.CalcTotalSale()
});

public class Sale
{
    public int Id { get; set; }
    public decimal Total { get; set; }
    public decimal Discount { get; set; }

    public Expression<Func<Sale, decimal>> CalcTotalSale()
    {
        return (s => s.Total - s.Discount);
    }
}

此代码无法编译,因为无法隐含转换Expression&gt;像我预期的一样小数。

1 个答案:

答案 0 :(得分:0)

如果您希望在LINQ to Entities中动态构建SELECT查询 AND 具有可重用的方法,那么这是一个更高级的主题,我不会尝试在此处覆盖答案。

虽然不清楚您的&#34;其他查询&#34;看起来,我想指出一种可能有助于您以不同方式思考表达式的替代方法。您可以执行以下操作:

          X
index
  0      thank
  1      [thank, thanks, thanking]
  2      thanked

另一种方法是将 SaleDto 中的 TotalSale 属性设为计算属性。如果您希望TotalSale计算(Total - Discount)在其他DTO类中可用,那么在其他地方创建一个接受两个参数(Total,Discount)并返回小数并在整个过程中重用的新方法。更好的是,将它移动到所有类似Sale类必须实现的接口/抽象基类中。

repos.ItemDocumentoProprio.Select(Sale.GetSaleDto());

public class Sale
{
    public int Id { get; set; }
    public decimal Total { get; set; }
    public decimal Discount { get; set; }

    public static Expression<Func<Sale, SaleDto>> GetSaleDto()
    {
        // As mentioned in my response, if you need to build this expression dynamically at
        // runtime for different data calls to the DB store, that is a more advanced task.
        Expression<Func<Sale, SaleDto>> selectFunc = s => new SaleDto
        {
            Total = s.Total,
            TotalSale = s.Total - s.Discount
        };

        return selectFunc;
    }
}

这里唯一的区别是你在内存中执行TotalSale计算而不是在RDBMS中。在没有进行任何形式分析的情况下,我猜测性能差异可以忽略不计,通过线路从数据库发送到应用程序的数据将具有相似的大小。