Linq to sql 父实体的LINQ到sql表达式

Linq to sql 父实体的LINQ到sql表达式,linq-to-sql,lambda,Linq To Sql,Lambda,我正在尝试创建Linq表达式,可以使用该表达式查询父属性的子实体(本例中为患者实体),方法如下: private IQueryable<LAB_ORDER> SelectFilter(string fieldName, string value) { var param = Expression.Parameter(typeof(PATIENT), "item"); var field = Expression.PropertyOrField(param, fieldNa

我正在尝试创建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);
} 
private IQueryable SelectFilter(字符串字段名、字符串值)
{
var param=表达式参数(患者类型,“项目”);
var field=Expression.PropertyOrField(参数,字段名);
var search=Expression.Constant(值,typeof(字符串));
var body=Expression.Call(字段“Contains”,null,search);
表达lambda;
if(String.IsNullOrEmpty(value))
{
lambda=x=>true;
}
其他的
{
lambda=表达式.lambda(body,parm);
}
var linqFilter=来自上下文中的e。实验室订单选择e;
返回linqFilter.Where(λ);
} 
看起来它正确地构建了表达式,但我得到的例外是:

System.ArgumentException: “患者”类型的参数表达式 不能用于委托参数 属于“实验室订单”类型

虽然我可以做linqFilter.Where(x=>x.PATIENT.LAST_NAME==“Smith”)而没有任何问题,但不能使用上面的表达式,这应该转化为类似的内容。我如何修复上面的表达式来更正它?我急切地用一个子实体加载父实体,所以这不是问题

编辑

从Anders回复来看,我需要将lambda表达式修改为:

lambda = Expression.Lambda<Func<PATIENT, bool>>(body, parm);
lambda=Expression.lambda(body,parm);
现在,当我尝试使用它时,linqFilter.Where(lambda)给了我编译错误“No-property重载”,我理解为什么-linqFilter是
“IQueryable”,而不是“IQueryable”
那么我应该怎么做呢?
总而言之,唯一的问题是——如何为父属性创建表达式

在下面的语句中,您说您将构建一个函数,该函数接受LAB_ORDER参数并返回bool

lambda = Expression.Lambda<Func<LAB_ORDER, bool>>(body, parm);
但是你建立的表达是

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(参数,“PATIENT.LAST_NAME”);您必须构建一个嵌套表达式,首先从实验室顺序中选择患者的姓名,然后从患者的姓氏中选择。谢谢,您可以演示如何操作吗?到目前为止还没有创建嵌套表达式。是这样的:expression.PropertyOrField(expression.PropertyOrField(param,“patient”),“LAST\u NAME”);还是更复杂?
x => x.[fieldName].Contains()