实体框架组和实际SQL没有有效地编写
本文关键字:有效地 SQL 框架 实体 | 更新日期: 2023-09-27 18:04:04
我编写了以下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)
这会产生更快的查询