【问题标题】:LINQ-TO-sql expression for parent entity父实体的 LINQ-TO-sql 表达式
【发布时间】: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&lt;LAB_ORDER&gt;", not "IQueryable&lt;PATIENT&gt;", 那我该怎么做呢? 总结一下,唯一的问题是——如何为父属性创建表达式?

【问题讨论】:

    标签: linq-to-sql lambda


    【解决方案1】:

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

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

    但是,parm 变量包含一个 PATIENT。您将不得不重写表达式 lambda 来取而代之的是 LAB_ORDER。如果我正确理解您的意图,那么您要表达的表达是

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

    但是你构建的表达式是

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

    【讨论】:

    • 感谢安德斯的回复。这是完全正确的 - 我试图表达 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 表达式吗?谢谢
    • 另外,如果我将 lambda 更改为 lambda = Expression.Lambda>(body, parm);然后 linqFilter.Where(lambda) 给我编译错误 - 没有合适的重载。
    • 你不能使用 Expression.PropertyOrField(param, "PATIENT.LAST_NAME");您必须构建一个嵌套表达式,首先从 LAB_ORDER 中选择 pation,然后从患者中选择 LAST_NAME。
    • 谢谢,你能告诉我怎么做吗?到目前为止还没有做过嵌套表达式。
    • 是不是像这样:Expression.PropertyOrField(Expression.PropertyOrField(param, "PATIENT"), "LAST_NAME");还是更复杂?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    相关资源
    最近更新 更多