我们正在一个项目中,其中有很多linq查询没有经过优化,因为在他们开始于项目时,他们对所有模型都使用了virtual属性。
我的任务是优化查询的最大数量,以提高应用程序性能。
问题是,如果我使用Include函数并从模型中删除所有虚拟属性,那么很多事情将停止工作,并且受影响的函数数量将很大。
因此,我想如果可以找到类似于“排除”的东西,以在某些情况下排除不必要的子查询。
答案 0 :(得分:0)
(假设您的结果集实现了多个)
我的首选是:
ListMain.Except(ItemsToExclude);
或者,我将使用(不使用)“包含”,如下所示,并在两者之间进行检查以排除记录。这可能不是最好的出路,但我可以工作。
!ListMain.Contains(ItemsToExclude)
答案 1 :(得分:0)
我不知道我的问题是否对,但是为避免加载某些属性或相关对象,您可以添加一个Select()
,仅包含所需的内容。
示例: 一个简单的ToList()将从表中带走整个对象:
var resultList = await dbContext.ABTests.AsNoTracking().ToListAsync();
它将在查询中得出:
SELECT [a].[Id], [a].[AssignedUsers], [a].[EndDate], [a].[Groups], [a].[Json], [a].[MaxUsers], [a].[Name], [a].[NextGroup], [a].[StartDate]
FROM [ABTests] AS [a]
(包括ABTest
对象的所有映射字段)
为避免获取全部内容,您可以执行以下操作:
var resultList = await dbContext.ABTests.AsNoTracking().Select(x => new ABTest
{
Id = x.Id,
Name = x.Name
}).ToListAsync();
(假设您只想紧急加载字段Id
和Name
)
产生的SQL查询将是:
SELECT [a].[Id], [a].[Name]
FROM [ABTests] AS [a]