【发布时间】:2016-06-01 12:25:15
【问题描述】:
我想在 iqueryable 上使用表达式树执行 linq 方法,该函数来自我传递 linq 方法名称和属性名称的函数。但我的示例方法仅适用于映射属性。例如,当我尝试查找计算属性的最大值时,它会引发异常。
我的课:
public partial class Something
{
public int a { get; set; }
public int b { get; set; }
}
public partial class Something
{
public int calculated { get { return a * b; } }
}
示例方法:
public static object ExecuteLinqMethod(IQueryable<T> q, string Field, string Method)
{
var param = Expression.Parameter(typeof(T), "p");
Expression prop = Expression.Property(param, Field);
var exp = Expression.Lambda(prop, param);
Type[] types = new Type[] { q.ElementType, exp.Body.Type };
var mce = Expression.Call(typeof(Queryable),Method,types,q.Expression,exp);
return q.Provider.Execute(mce);
}
【问题讨论】:
-
为什么你认为表达式树可以让你做一些 EF 查询提供者不支持的事情?
-
我需要通用方法来查找映射和未映射属性的最大值、最小值、总和等。使用给定的函数名称和属性名称作为此方法的参数。可以通过表达式树或其他方式完成。
-
那你为什么不先找到“其他方式”,如果需要的话再寻求表达式树的帮助。我想主要问题是如何确定该字段是否已映射。即使你这样做了,由于无法知道计算出的属性正在使用什么,唯一的执行方法是针对
IEnumerable<T>执行它。 -
我尝试了其他方法但没有成功。我有大型数据库并将所有记录获取到 IEnumerable
导致内存不足异常。 -
嗯,那么 IMO 除了传递包含仅基于映射字段而不是字段名称的计算的
Expression之外,没有其他解决方案。
标签: c# entity-framework linq expression-trees