gpt4 book ai didi

c# - Entity Framework 分组依据和未有效编写的实际 SQL

转载 作者:行者123 更新时间:2023-11-30 23:21:34 24 4
gpt4 key购买 nike

我编写了以下 EF 查询,它从 Person 类扩展,其中人员联系电话是一个集合:

var person = await _tmsContext.Person.SingleOrDefaultAsync(p => p.UserID == userId);

person.PersonContactNumbers
.Where(x => clientNumberTypes.Contains(x.ContactNumberTypeId)
&& x.ValidFromDate < DateTime.Now
&& (!x.ValidToDate.HasValue || x.ValidToDate > DateTime.Now))
.GroupBy(x => x.ContactNumberTypeId, (key, group) =>
group.OrderBy(cnt => cnt.DateCreated)
.Select(cnt => new { cnt.ContactNumber, cnt.ContactNumberTypeId })
.FirstOrDefault())
.ToList();

生成的 SQL 如下所示:

exec sp_executesql N'SELECT 
[Extent1].[PersonContactNumberID] AS [PersonContactNumberID],
[Extent1].[ContactNumberTypeID] AS [ContactNumberTypeID],
[Extent1].[ContactNumber] AS [ContactNumber],
[Extent1].[ValidFromDate] AS [ValidFromDate],
[Extent1].[ValidToDate] AS [ValidToDate],
[Extent1].[xxxxxxx] AS [xxxxxxx],
[Extent1].[xxxxxxx] AS [xxxxxxx],
[Extent1].[xxxxxxx] AS [xxxxxxx],
[Extent1].[xxxxxxx] AS [xxxxxxx],
[Extent1].[xxxxxxx] AS [xxxxxxx],
[Extent1].[xxxxxxx] AS [xxxxxxx]
FROM [dbo].[tjPersonContactNumber] AS [Extent1]
WHERE [Extent1].[PersonID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=XXXXXXX

这会清楚地向我表明 EF 正在请求指定人员的所有联系电话,然后在内存中过滤掉不需要的数据,然后分组并取第一个或默认值。

对于少量数据,这没问题,但是,在某些情况下,如果有大量数据(联系人只是一个例子),它不仅会返回从未使用过的列 (xxxxxx),而且还需要相当多的时间。

有人知道为什么 EF 创建这样一个简单的查询,然后在内存中完成其余的工作,有人知道如何强制 EF 在查询中进行分组和过滤吗?

最佳答案

您遇到的问题看起来像是您急切加载了子对象。

您可以直接访问上下文并调用子对象吗?

有点像

dbContext.PersonContactNumbers.Where(x=>x.PersonId == yourId)

这应该会产生更快的查询

如果没有,请确保您已关闭预先加载。

关于c# - Entity Framework 分组依据和未有效编写的实际 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39168307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com