Linq:按日期排序并查找第一个元素

时间:2013-08-29 12:17:50

标签: c# linq linq-to-entities

我想查询数据表,其中我根据某些数据选择行列表,并按日期对行进行排序并获取具有最新日期的行。这就是我所做的

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.

我如何实现我的预期,以及如何解决错误?

3 个答案:

答案 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提供商无法处理FirstOrDefaultTakeSingleOrDefault,您可以强制它:

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();