[英]How to use one C# expression inside another C# expression for Entity Framework?
[英]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);
我希望我理解你的问题,看看这个讨论。 您不需要额外的论证,但如何将事情安排在一起的想法可能适用于您的案例。
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.