如何使用 LINQ 仅从实体加载最后一条记录?
Posted
技术标签:
【中文标题】如何使用 LINQ 仅从实体加载最后一条记录?【英文标题】:How to load just the last record from entity with LINQ? 【发布时间】:2013-10-07 22:28:09 【问题描述】:我想从最后一条记录中获取名为“Gram”的字段的值并将其值放入变量中,而不使用任何条件。
第一次尝试
int value = int.Parse(Entity.TblGold.LastOrDefault().Gram.ToString());
我第二次尝试
int value = int.Parse(Entity.TblGold.Select(p => p.Gram).Last().ToString());
我刚刚收到这个异常:
LINQ to Entities does not recognize the method 'DataModel.TblGold LastOrDefault[TblGold](System.Linq.IQueryable``1[DataModel.TblGold])' method, and this method cannot be translated into a store expression.
【问题讨论】:
旁注:数据库中通常没有“最后一个”记录的概念......只有“最后一个,按字段排序时”。 应该有一个解决方案。我在我的实体中有我的表。例如 200 条记录......我想要一个来自 LAST 记录的特殊字段的值。没有条件。所以怎么能我从字段中获取这个值?????? :( 你能给我推荐代码吗,很抱歉打扰你的时间 【参考方案1】:如果你有一个增量 id:
int idx = tb.Max(i => i.Id);
var row = tb.FirstOrDefault(i => i.Id == idx);
【讨论】:
【参考方案2】:您可以使用 order by 1 == 1 并且它有效
var countOfRows = tbl.Count();
var lastRow = tbl.OrderBy(c => 1 == 1).Skip(countOfRows - 1).FirstOrDefault();
【讨论】:
【参考方案3】:Last
或 LastOrDefault
在 LINQ to Entities 中不受支持。您可以使用ToList
或ToArray
迭代您的查询,然后应用Last
,或者您可以按降序排序,然后使用First
,例如:
int value = int.Parse(Entity.TblGold
.OrderByDescending(p => p.Gram)
.Select(r => r.Gram)
.First().ToString());
【讨论】:
非常感谢。非常有用:) @amin,不客气,今天看到你加入了,欢迎来到 ***。 你真好 :) 非常感谢。所以我想通了,我们应该有某种实例来做最后或第一个或像这些? @amin,不是真的,因为首先,它被翻译成SELECT Top (1)
所以你实际上不必迭代查询。上面的回答中的查询被翻译成类似 SELECT TOP 1 Gram from tblGold Order by Gram DESC;
的东西。使用Last/LastOrDefault
,表达式无法转换为底层数据源语言 (SQL)。
@amin,对不起,我错过了选择特定字段的部分。只需检查更新的答案【参考方案4】:
你不能在一个查询中完成,但你可以在两个查询中完成。
var countOfRows = tbl.Count();
var lastRow = tbl.Skip(countOfRows - 1).FirstOrDefault();
【讨论】:
您的代码无法编译,因为没有存储或使用 orderby 的错误关闭以上是关于如何使用 LINQ 仅从实体加载最后一条记录?的主要内容,如果未能解决你的问题,请参考以下文章
通过 linq 对实体查询进行分组,以通过加入表来获取具有最新时间戳的一条记录
如何确保仅从特定表中选择第一条记录,该表可以在 DB2 中包含多个相同 ID 的记录
在 EFCore 急切加载 LINQ 查询中,如何在 ThenInclude() 表达式中引用***实体?