【发布时间】:2010-03-04 11:23:59
【问题描述】:
我正在尝试使用此方法创建可用于查询子实体的父属性(在本例中为患者实体)的 Linq 表达式:
private IQueryable<LAB_ORDER> SelectFilter(string fieldName, string value)
{
var param = Expression.Parameter(typeof(PATIENT), "item");
var field = Expression.PropertyOrField(param, fieldName);
var search = Expression.Constant(value, typeof(string));
var body = Expression.Call(field, "Contains", null, search);
Expression<Func<LAB_ORDER, bool>> lambda;
if (String.IsNullOrEmpty(value))
{
lambda = x => true;
}
else
{
lambda = Expression.Lambda<Func<LAB_ORDER, bool>>(body, parm);
}
var linqFilter = from e in context.LAB_ORDERS select e;
return linqFilter.Where(lambda);
}
看起来它正确地构建了一个表达式,但我得到的例外是:
System.ArgumentException: 'PATIENT' 类型的参数表达式 不能用于委托参数 LAB_ORDER' 类型。
虽然我可以毫无问题地执行 linqFilter.Where( x => x.PATIENT.LAST_NAME == "Smith") ,但不能使用上面的表达式,它应该转换为类似于此的内容。我将如何修复上面的表达式来纠正它?我急切地用孩子加载父实体,所以这不是问题。
编辑
从 Anders 的回复看来,我需要将 lambda 表达式修改为:
lambda = Expression.Lambda<Func<PATIENT, bool>>(body, parm);
现在当我尝试使用它时,linqFilter.Where(lambda) 给了我编译错误“没有合适的重载”,我明白为什么 - linqFilter 是
"IQueryable<LAB_ORDER>", not "IQueryable<PATIENT>", 那我该怎么做呢?
总结一下,唯一的问题是——如何为父属性创建表达式?
【问题讨论】:
标签: linq-to-sql lambda