C# IQueryable<;对象>;LINQ表达式抛出';System.Object';输入';匿名类型';
我编写linq查询以获取数据并存储在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
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秒内加载。无论如何,谢谢你的建议。