LINQ查询性能
本文关键字:性能 查询 LINQ | 更新日期: 2023-09-27 18:04:47
我在一个项目中使用实体框架4,我有一个特定的查询,一遍又一遍地运行,我需要确保它尽可能地优化。
我有一个名为Items
的数据库表,它有以下重要列:
id (primary key)
name
另一个名为FavoriteItems
的表有两个重要列
itemId (foreign key to the items table)
accountId( foreign key to the account table)
在我的代码中的一个方法中,我有accountId
和searchTerm
作为输入参数。
该方法应该返回条目表中包含searchTerm作为其名称一部分的所有条目,此外,它应该按字母顺序排序,但是在FavoriteItems表中找到的具有其Id的所有条目,其中accountId与作为参数给出的accountId相匹配,应该放在顶部(并按字母顺序排序)。此外,搜索结果应该包含一个布尔值,指示它是否是收藏项。
我已经得到了它的工作,但查询似乎笨拙。如何以一种优雅而高效的方式编写这个查询?
我想你的意思是这样的:
public void TheMethod(int accountId, string searchTerm)
{
var result = from item in ctx.Items
where item.Name.Contains(searchTerm)
let temp = new
{
Name = item.Name,
IsFavorite = item.FavoriteItems
.Any(f => f.AccountId == accountId)
}
orderby temp.IsFavorite descending, temp.Name
select temp;
}
创建一个中间对象,只包含您需要的值,排序并选择它。
我不认为它可以进一步优化,因为你需要所有的项目都有searchTerm
的名称。这可能是最昂贵的部分,因为它转换成WHERE Name LIKE %@name%
。
产生IsFavorite
字段的.Any
调用产生EXISTS SELECT TOP(1)...
类型的查询,并且应该非常便宜。