如何解决这两个LINQ查询之间有什么区别,以及如何正确优化它们?
我有一个Clients表,该表包含以下列: ID,名字,姓氏,货币ID,性别。
我要选择与ID 10相对应的客户货币,因此我正在执行以下操作:
var currencyId = Db.Clients.FirstOrDefault(c=>c.Id == 10)?.CurrencyId;
此行是从Db中获取所有属性并在代码中选择货币还是在数据库中执行以下操作:
SELECT currencyId FROM Client WHERE ID = 10
或者我应该这样写linq:
var currencyId = Db.Clients.Where(c=>c.Id == 10).Select(c=>c.CurrnecyId).FirstOrDefault();
两个查询之间有什么区别? 将上述SQL查询转换为linq查询的正确方法是什么?
解决方法
我自己仔细研究了一下,因为我发现大多数人的答案都值得怀疑。我希望FirstOrDefault
实现结果(您还会从不再使用查询对象的类型中看到),所以这意味着它将查询所有属性。
与第二个查询不同,在过滤喜欢的属性时,第二个查询仍在使用查询,因此取决于实现方式,它可用于过滤属性和选择特定字段。
以下是使用EF为两个类似查询生成的查询的示例,其中显示了它们都生成不同的查询:https://dotnetfiddle.net/5aFJAZ
,在您的第一个示例中,var currencyId = Db.Clients.FirstOrDefault(c=>c.Id == 10)?.CurrencyId;
查询将整个对象选择到内存中,然后从该内存对象中的Id属性返回。因此,它需要执行类似以下SQL的操作:SELECT * FROM Clients WHERE Id = 10
。我知道我不在这里使用参数,并且EF确实拼出了每一列。但是,此处要理解的关键是,由于返回的列数超出了您的需要,因此可能会引起性能问题,因为将不会使用Id和CurrencyId的覆盖索引。
您的第二个LINQ查询将使用诸如SELECT CurrencyId FROM Clients Where Id = 10
之类的SQL语句,假设您有覆盖这些列的索引,它将利用您的索引。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。