Linq:在数据库上使用ElementAt

时间:2015-10-08 05:53:08

标签: c# entity-framework linq

我正在尝试使用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);

但我得到同样的错误。知道我错过了什么吗?感谢

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