我想创建,我可以用它来查询(在这种情况下,患者实体)为父属性子实体LINQ表达式,使用这种方法:LINQ到SQL表达式母公司
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: 的类型“患者 ParameterExpression不能被用于类型LAB_ORDER的委托参数 ”。
虽然我可以没有任何问题做linqFilter.Where(X => x.PATIENT.LAST_NAME ==“史密斯”),不能使用上述表达式,这应该转换为与此类似。我如何修复上述表达式来纠正它?我急切地向孩子加载父母实体,所以这不成问题。
编辑
安德斯回复它看起来像我需要修改lambda表达式:
lambda = Expression.Lambda<Func<PATIENT, bool>>(body, parm);
现在,当我尝试使用它,linqFilter.Where(拉姆达)给我编译错误“没有合适的超载”,我明白为什么 - linqFilter是 "IQueryable<LAB_ORDER>", not "IQueryable<PATIENT>",
所以我应该怎么做? 只是总结一下,唯一的问题仍然是 - 如何为父属性创建表达式?
感谢您的回复安德斯。这是完全正确的 - 我试图表达x => x.PATIENT。[fieldName] .Contains()。但如果我尝试var param = Expression.Parameter(typeof(LAB_ORDER),“item”);那么我会在下一行出现异常:var field = Expression.PropertyOrField(param,“PATIENT.LAST_NAME”); - “PATIENT.LAST_NAME不是LAB_ORDER的成员,你能告诉我如何修改lambda表达式吗?谢谢 – Victor 2010-03-03 20:31:57
另外,如果我改变我的lambda为 lambda = Expression.Lambda>(body, parm);然后 linqFilter.Where(lambda)给我编译错误 - 没有合适的重载 –
Victor
2010-03-03 20:57:12
你不能使用Expression.PropertyOrField(param,“PATIENT.LAST_NAME”);你必须建立一个嵌套的表达式,首先挑出这个是LAB_ORDER,然后是来自病人的LAST_NAME。 – 2010-03-04 07:55:35