实体框架组和实际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在查询中做分组和过滤吗?

实体框架组和实际SQL没有有效地编写

您遇到的问题似乎是您有急于加载的子对象。

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

之类的
dbContext.PersonContactNumbers.Where(x=>x.PersonId == yourId)

这会产生更快的查询