我需要使用在查询之外定义的表达式。此表达式将用于许多其他查询中,因此我想重用它。
这是一个简单的例子来说明。
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;像我预期的一样小数。
答案 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中。在没有进行任何形式分析的情况下,我猜测性能差异可以忽略不计,通过线路从数据库发送到应用程序的数据将具有相似的大小。