【问题标题】:How I can optimize my LINQ query?如何优化我的 LINQ 查询?
【发布时间】:2018-08-25 09:47:47
【问题描述】:

我编写了以下 LINQ 查询以返回组列表,然后分别迭代列表。

我只需要具有特定电子邮件的用户组列表。

我相信这可能不是现在。

我可以用更好的方式重写它吗(性能方面)?

var groups = _context.Users.Where(m => m.Email == email)
                           .Include(g => g.Customer)
                           .ThenInclude(r => r.CustomerGroups)
                           .ThenInclude(t => t.Group)
                           .First().Customer.CustomerGroups;

foreach (var group in groups)
{
    var s = group.Group;
    //do something
}

【问题讨论】:

  • 您的逻辑实际需要哪些数据?它是否需要有关属于某个组的客户的信息?如果是这样,是否需要电子邮件等用户详细信息?
  • @AdamSimon 我只需要具有特定电子邮件的用户组列表。
  • 请解释您当前查询的问题是什么,以及您所说的“优化”、“不正确”或“更好”的方式等到底是什么意思。例如,您是否遇到异常?或者得到不正确的结果,或者它很慢,或者加载了太多的数据,或者没有加载你需要的数据等等。
  • @Bart 好的,我想我的回答现在涵盖了您问题的所有可能方面。

标签: c# sql-server linq entity-framework-core


【解决方案1】:

如果您只需要具有相关 Group 实体的 CustomerGroup 实体(正如我在评论部分解释您的说明),那么获取其他相关实体(用户客户)。您可以使 EF 仅获取您感兴趣的实体,如下所示:

var groups = 
(
    from user in _context.Users
    from customerGroup in user.Customer.CustomerGroups
    where user.Email == email
    select customerGroup
).Include(cg => cg.Group);

或者当 CustomerGroup 不存储相关数据,仅存储关系时:

var groups = 
(
    from user in _context.Users
    from customerGroup in user.Customer.CustomerGroups
    where user.Email == email
    select customerGroup.Group
);

【讨论】:

  • @GertArnold 感谢您的建议。删除了有关包含和冗余的旁注,因为事实证明它不适用于 EF Core。
【解决方案2】:

试试这个:

这是对CustomerGroups 表进行查询,因此您不需要包含CustomerCustomerGroups

var customerGroups = _context.CustomerGroups.Where(m => m.Customer.User.Email == email)
                    .Include(t => t.Group).
                     Select(s=> new CustomerGroupModel {
                           A= s.A,
                           B= s.B,
                           …
                           Group = s.Group
                     }).ToList();

或者

  var customerGroups = _context.Customer.Where(m => m.User.Email == email)
                .Include(r => r.CustomerGroups).ThenInclude(t => t.Group).
                 Select(s=> new CustomerGroupModel {
                       A= s.CustomerGroups.A,
                       B= s.CustomerGroups.B,
                       …
                       Group = s.CustomerGroups.Group
                 }).ToList();

【讨论】:

  • 您能否补充说明为什么您的答案更优化?
  • 解释不适合我,请查看how to answer 以获得更好的合格答案。答案可能是正确的,但根本不合格。您编写的代码可能无法被 OP 理解。所以我建议你编辑你的答案并添加解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
相关资源
最近更新 更多