【问题标题】:Linq: Using ElementAt on a databaseLinq:在数据库上使用 ElementAt
【发布时间】:2015-10-08 05:53:08
【问题描述】:

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

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

【问题讨论】:

    标签: c# entity-framework linq


    【解决方案1】:

    首先,请注意 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();
    

    我希望这些解决方案中至少有一个可以工作 - 我已经按照我喜欢的顺序介绍了它们。

    【讨论】:

    • 好的。那么如果我想使用 Linq 方法 Last() 呢?
    • @tabby:那将是一个不同的问题 - 对于有序序列,我希望这可能会奏效,但您必须尝试一下。另一种方法是使用相反的顺序并调用First()
    • 嗯是的。那么像 ElementAt 等方法只需要在有序列表上使用吗?
    • @tabby:是的,完全按照我回答的第二段。
    • Linq to Entities 是否支持此类操作? ElementAt 可以转换为 SQL 查询吗?
    【解决方案2】:

    你应该使用db.Persons.OrderBy(p => p.Id).Skip(2).Take(1).FirstOrDefault()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2019-11-25
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多