使用LINQ从第一项检索属性

本文关键字:一项 检索 属性 LINQ 使用 | 更新日期: 2023-09-27 18:04:15

是否有更简单的方法在Linq中编写这个查询:

var prioritiy = db.Requirements.Where(r => r.ID == rowID).Select(r => r.Priority).First();

使用LINQ从第一项检索属性

如果你的意思是"更简单"即"更少的代码",那么你的自我回答已经是最简洁的了:

db.Requirements.First(r => r.ID == rowID).Priority;

如果你的意思是"更简单",如"更少的数据库开销",那么你的原始版本稍微好一点:

db.Requirements.Where(r => r.ID == rowID).Select(r => r.Priority).First();

为什么?正如@IvanStoev在评论中指出的那样,LINQ的执行被推迟,直到你调用像First()这样的"finish"方法。如果在后端使用SQL,则第二个示例将被转换为仅从数据库检索Priority字段的SQL语句,而第一个示例将检索匹配行的所有字段。

在我看来,这绝对属于不必要的微优化范畴,除非这段代码运行了数百万次,或者整个数据库对象有大量的列。除非你在做一些疯狂的事情,否则就用你喜欢的风格吧!

没关系。我刚刚发现,通过最初应用First(),我返回一个包含我正在寻找的属性的对象。代码变成:

var priority = db.Requirements.First(r => r.ID == rowID).Priority;

Visual Studio 2015的安全版本

var priority = db.Requirements.FirstOrDefault(r => r.ID == rowID)?.Priority;
如果你经常调用,你可以使用LookUp
var lookup = db.Requirements.ToLookup(r => r.ID, r => r.Priority);
var priority = lookup[rowID].FirstOrDefault();