我正在尝试使用Linq方法ElementAt获取数据库的第二个元素。但是我收到以下错误:
LINQ to Entities无法识别方法'PersonData.Models.Person ElementAt [Person](System.Linq.IQueryable`1 [PersonData.Models.Person],Int32)'方法,而且此方法无法转换为商店表达。
我试过这样做:
var P1= db.Person.ElementAt(2);
但徒劳无功。 我也试过这个:
var pl = from s in db.Persons select s;
var Person1 =pl.ElementAt(2);
但我得到同样的错误。知道我错过了什么吗?感谢
答案 0 :(得分:5)
首先,请注意ElementAt
从0开始 - 如果您想要第二个元素,则应使用ElementAt(1)
,而不是ElementAt(2)
。 (把它想象成数组索引。)
我对它在无序查询中拒绝ElementAt
并不感到惊讶,尽管我希望有更好的信息。我相信数据库表中的行本质上是无序的 - 因此按索引获取元素毫无意义。 (同样地要求第一个或最后一个元素没有多大意义。)任何依赖于某个位置的操作只有在该位置具有确定性时才有意义。
您可以先尝试对其进行排序,例如
var person = db.Person.OrderBy(p => p.Id).ElementAt(1);
如果仍然不起作用,您可以尝试使用Skip
:
var person = db.Person.OrderBy(p => p.Id).Skip(1).FirstOrDefault();
或者如果仍然不起作用:
var person = db.Person.OrderBy(p => p.Id).Skip(1).Take(1).AsEnumerable().First();
我希望这些解决方案中至少有一种能够发挥作用 - 而且我已经按照我喜欢的顺序展示了它们。
答案 1 :(得分:0)
您应该使用db.Persons.OrderBy(p => p.Id).Skip(2).Take(1).FirstOrDefault()