我想查询数据表,其中我根据某些数据选择行列表,并按日期对行进行排序并获取具有最新日期的行。这就是我所做的
var propertyValueId = _dbSis.Set<PropertyValue>()
.Where(m => m.PropertyInstanceId == id)
.OrderBy(z => z.TimeStamp);
var pvalueId = propertyValueId.ElementAtOrDefault(0);
但我在propertyValueId.ElementAtOrDetault(0);
LINQ to Entities does not recognize the method 'Sorama.DataModel.SIS.Configuration.PropertyValue ElementAtOrDefault[PropertyValue](System.Linq.IQueryable`1[Sorama.DataModel.SIS.Configuration.PropertyValue], Int32)' method, and this method cannot be translated into a store expression.
我如何实现我的预期,以及如何解决错误?
答案 0 :(得分:1)
发生此错误的原因是 Linq to Entities 不支持大量 Linq to Objects 方法。这是因为Linq to Entities将您的查询转换为表达式树,然后将在SQL上执行。
您可以找到支持和不支持的方法的完整列表here。
正如 @Gusdor 所提到的:表达式中的无法识别的方法(你的lambda正在解析)被视为存储过程,而后者又不存在。检查将会发生什么的简单方法是查看LINQ方法的参数列表。
因此,为了解决您的问题,您应该使用允许的方法,例如FirstOrDefault
:
var pvalueId = propertyValueId.FirstOrDefault();
答案 1 :(得分:0)
奇怪的是FirstOrDefault()
不起作用。
var pvalueId = propertyValueId.FirstOrDefault();
不应该支持:
var pvalueId = propertyValueId.Take(1).SingleOrDefault();
或者,如果由于某些奇怪的原因,您的L2EF提供商无法处理FirstOrDefault
,Take
或SingleOrDefault
,您可以强制它:
PropertyValue pvalueId = null;
foreach (var pv in propertyValueId)
{
pvalueId = pv;
break;
}
答案 2 :(得分:0)
你可以尝试一下:
var propertyValueId = _dbSis.Set<PropertyValue()
.Where(m=>m.PropertyInstanceId==id)
.OrderBy(z=>z.TimeStamp).FirstOrDefault();