2010-03-03 164 views
1

我想创建,我可以用它来查询(在这种情况下,患者实体)为父属性子实体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>",所以我应该怎么做? 只是总结一下,唯一的问题仍然是 - 如何为父属性创建表达式?

回答

2

在下面的语句中,你说你将建立一个函数,它接受一个LAB_ORDER参数并返回一个布尔值。

lambda = Expression.Lambda<Func<LAB_ORDER, bool>>(body, parm); 

但是,parm变量包含一个患者。您将不得不重写表达式lambda以代替LAB_ORDER。如果我理解你的意图,你正确你想表达的表达是

x => x.PATIENT.[fieldnName].Contains() 

,但你已经建立了表达

x => x.[fieldName].Contains() 
+0

感谢您的回复安德斯。这是完全正确的 - 我试图表达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

+0

另外,如果我改变我的lambda为 lambda = Expression.Lambda >(body, parm);然后 linqFilter.Where(lambda)给我编译错误 - 没有合适的重载 – Victor 2010-03-03 20:57:12

+0

你不能使用Expression.PropertyOrField(param,“PATIENT.LAST_NAME”);你必须建立一个嵌套的表达式,首先挑出这个是LAB_ORDER,然后是来自病人的LAST_NAME。 – 2010-03-04 07:55:35