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)

在我的代码中的一个方法中,我有accountIdsearchTerm作为输入参数。

该方法应该返回条目表中包含searchTerm作为其名称一部分的所有条目,此外,它应该按字母顺序排序,但是在FavoriteItems表中找到的具有其Id的所有条目,其中accountId与作为参数给出的accountId相匹配,应该放在顶部(并按字母顺序排序)。此外,搜索结果应该包含一个布尔值,指示它是否是收藏项。

我已经得到了它的工作,但查询似乎笨拙。如何以一种优雅而高效的方式编写这个查询?

LINQ查询性能

我想你的意思是这样的:

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)...类型的查询,并且应该非常便宜。