实体框架包括相反

时间:2018-07-11 09:52:59

标签: c# performance entity-framework linq include

我们正在一个项目中,其中有很多linq查询没有经过优化,因为在他们开始于项目时,他们对所有模型都使用了virtual属性。

我的任务是优化查询的最大数量,以提高应用程序性能。

问题是,如果我使用Include函数并从模型中删除所有虚拟属性,那么很多事情将停止工作,并且受影响的函数数量将很大。

因此,我想如果可以找到类似于“排除”的东西,以在某些情况下排除不必要的子查询。

2 个答案:

答案 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();

(假设您只想紧急加载字段IdName) 产生的SQL查询将是:

SELECT [a].[Id], [a].[Name]
FROM [ABTests] AS [a]