林克:按日期排序,找到第一个元素

本文关键字:第一个 元素 排序 日期 林克 | 更新日期: 2023-09-27 18:29:25

我想查询一个数据表,在那里我根据一些数据选择行列表,并按日期对行进行排序,得到最新日期的行。这就是我所做的

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.

我怎样才能达到我所期望的,怎样才能解决错误?

林克:按日期排序,找到第一个元素

出现此错误的原因是Linq-to-Entities不支持许多Linq-to-Objects方法。这是因为Linq-to-Entities将您的查询转换为表达式树,然后在SQL上执行
支持和不支持的方法的完整列表,您可以在此处找到

正如@Gusdor所提到的:表达式中未识别的方法(您的lambdas正在解析到该方法)被视为存储过程,而存储过程又不存在。检查将要发生的情况的简单方法是查看LINQ方法的参数列表。

因此,要解决您的问题,您应该使用允许的方法,如FirstOrDefault:

var pvalueId = propertyValueId.FirstOrDefault();

FirstOrDefault()不工作似乎很奇怪。

var pvalueId = propertyValueId.FirstOrDefault();

如果不支持:

var pvalueId = propertyValueId.Take(1).SingleOrDefault();

或者,如果由于某种奇怪的原因,您的L2EF提供程序无法处理FirstOrDefaultTakeSingleOrDefault,您可以强行执行:

PropertyValue pvalueId = null;
foreach (var pv in propertyValueId)
{
    pvalueId = pv;
    break;
}

你能试试吗:

var propertyValueId = _dbSis.Set<PropertyValue()
                            .Where(m=>m.PropertyInstanceId==id)
                            .OrderBy(z=>z.TimeStamp).FirstOrDefault();