如何使用LINQ仅加载实体中的最后一条记录?

20
我希望从最后一条记录中获取名称为“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 不认识 'DataModel.TblGold LastOrDefault[TblGold](System.Linq.IQueryable``1[DataModel.TblGold])' 方法,并且该方法无法被转换成存储表达式。


2
侧面说明:在数据库中通常没有“最后一条”记录的概念……只有“按字段排序时的最后一条”。 - Alexei Levenkov
应该有一个解决方案。我在实体中有我的表,例如200条记录...我想从最后一条记录中获取特定字段的值,没有条件。那么我该如何从字段中获取这个值? :( - amin
你能给我推荐一些代码吗?非常抱歉打扰了您的时间。 - amin
5个回答

45

LastLastOrDefault不支持LINQ to Entities。您可以使用ToListToArray迭代查询,然后应用Last,或者按降序排序,然后使用First,例如:

int value = int.Parse(Entity.TblGold
                            .OrderByDescending(p => p.Gram)
                            .Select(r => r.Gram)
                            .First().ToString());

@amin,欢迎您加入我们,我看到您今天刚刚注册了Stack Overflow。 - Habib
非常感谢您的热心 :) 我明白了,我们需要一些实例来执行“last”或“first”等操作对吗? - amin
@amin,不是真的。首先,它被翻译成了SELECT Top (1),所以你不需要迭代查询。上面的答案中的查询被翻译成了类似于SELECT TOP 1 Gram from tblGold Order by Gram DESC;的东西。对于Last/LastOrDefault,表达式无法翻译成底层数据源语言(SQL)。 - Habib
@amin,抱歉我错过了选择特定字段的部分。请检查更新后的答案。 - Habib
它真的帮了我很多 :) - Moeez

0

如果您有一个递增 id:

int idx = tb.Max(i => i.Id);
var row = tb.FirstOrDefault(i => i.Id == idx);

0

这就是你的答案,你不需要进行转换。

int value = Entity.TblGold.OrderByDescending(p => p.Id).First().Gram;

0

你不能在一个查询中完成它,但是你可以用两个查询来完成。

var countOfRows = tbl.Count();

var lastRow = tbl.Skip(countOfRows - 1).FirstOrDefault();

你的代码无法编译,因为出现了一个错误,原因可能是没有存储任何内容或没有使用orderby。 - amin

-1

你可以使用 order by 1 == 1,它是有效的。

var countOfRows = tbl.Count();    
var lastRow = tbl.OrderBy(c => 1 == 1).Skip(countOfRows - 1).FirstOrDefault();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接