C# IQueryable<;对象>;LINQ表达式抛出';System.Object';输入';匿名类型';

C# IQueryable<;对象>;LINQ表达式抛出';System.Object';输入';匿名类型';,c#,linq-expressions,C#,Linq Expressions,我编写linq查询以获取数据并存储在IQueryable中。之后,我想执行Linq表达式来删除一些空数据 IQueryable<object> employees; select new { temp.EMP_NO, personal.EMP_NAME, hptrx.TRX_CD, trx.TRX_DESC, CU

我编写linq查询以获取数据并存储在
IQueryable
中。之后,我想执行Linq表达式来删除一些空数据

  IQueryable<object> employees;

    select new
         {
              temp.EMP_NO,
              personal.EMP_NAME,
              hptrx.TRX_CD,
              trx.TRX_DESC,
              CURRENT_MONTH = hptrx.AMOUNT,
              PREVIOUS_MONTH = db.HPTRXes.Where(x => x.COMP_CD == temp.COMP_CD && x.EMP_NO == temp.EMP_NO && 
                               x.TRX_CD == hptrx.TRX_CD && x.P_MTH == previousMonth && x.P_YEAR == 
                               previousYear && x.P_PERIOD == record.P_PERIOD).Select(x => x.AMOUNT).FirstOrDefault()
         });
IQueryable员工;
选择新的
{
临时EMP_编号,
personal.EMP_名称,
hptrx.TRX_光盘,
trx.trx_DESC,
本月=hptrx.AMOUNT,
上个月=db.HPTRXes.Where(x=>x.COMP\u CD==temp.COMP\u CD&&x.EMP\u NO==temp.EMP\u NO&&
x、 TRX\u CD==hptrx.TRX\u CD和&x.P\u MTH==上个月和&x.P\u年==
上一年和&x.P\u期间==记录.P\u期间)。选择(x=>x.AMOUNT)。FirstOrDefault()
});
将执行以下代码以过滤掉上个月包含的null

 var propertyPreviousMonth = "PREVIOUS_MONTH";
 var sourceType = typeof(object);
 var underlyingType = employees.First().GetType();
 var propertyType = underlyingType.GetProperty(propertyPreviousMonth).PropertyType;
 var param = Expression.Parameter(sourceType);

 var left = Expression.Property(
      Expression.Convert(param, underlyingType), propertyPreviousMonth
 );
 Expression right = Expression.Constant(null);
 Expression e1 = Expression.NotEqual(left, right);
 var lambda = Expression.Lambda(e1, param);

 var expr = Expression.Call(typeof(Queryable), "Where", new Type[] { sourceType },
     employees.Expression, lambda
 );
 employees = employees.Provider.CreateQuery<object>(expr);
var propertyPreviousMonth=“上一个月”; var sourceType=typeof(对象); var underyingtype=employees.First().GetType(); var-propertyType=underyingType.GetProperty(propertyPreviousMonth).propertyType; var param=Expression.Parameter(sourceType); var left=Expression.Property( Expression.Convert(参数,参考类型),propertyPreviousMonth ); 表达式右=表达式常数(null); 表达式e1=表达式.NotEqual(左、右); var lambda=表达式.lambda(e1,param); var expr=Expression.Call(typeof(Queryable),“Where”,新类型[]{sourceType}, 员工,表情,兰姆达 ); employees=employees.Provider.CreateQuery(expr); 然而,我在调用
employees.Count()时遇到了以下错误

无法将类型“System.Object”强制转换为类型“Anonymous type”。林克 “到实体”仅支持强制转换EDM基元或枚举类型


只是一个建议,您可以尝试:

let prevMonth = db.HPTRXes.Where(x => x.COMP_CD == temp.COMP_CD && x.EMP_NO == temp.EMP_NO && 
                           x.TRX_CD == hptrx.TRX_CD && x.P_MTH == previousMonth && x.P_YEAR == 
                           previousYear && x.P_PERIOD == record.P_PERIOD).FirstOrDefault()
where prevMonth != null
select new
     {
          temp.EMP_NO,
          personal.EMP_NAME,
          hptrx.TRX_CD,
          trx.TRX_DESC,
          CURRENT_MONTH = hptrx.AMOUNT,
          PREVIOUS_MONTH = prevMonth.AMOUNT
     });

看起来上个月不是对象,它是什么?@JeroenvanLangen上个月是对象的属性。我想删除所有对象,其中
PREVIOUS\u MONTH==NULL
如何使用
employees=employees过滤结果。其中(e=>e.PREVIOUS\u MONTH!=NULL)我想你不需要表达式树来过滤掉已知的列/属性。我不能这样过滤,因为它是一个对象,属性将在运行时解析。这就是我尝试使用LINQ表达式的原因好吧,那么员工是空的。我可以像上面那样使用LINQ表达式实现吗?你应该试试,我不能在这里测试。。。我认为最重要的是,你在行而不是场上进行FirstOrDefault。如果Amount是一个数字,则默认值为0。(且不为null)它存在性能问题。
where prevMonth!=null
使查询在6秒内加载。无论如何,谢谢你的建议。