【问题标题】:How to utilize "IN" statement with Linq <> ASP.NET MVC <> C#如何在 Linq <> ASP.NET MVC <> C# 中使用“IN”语句
【发布时间】:2021-10-06 05:56:56
【问题描述】:

我很难找到实现 IN 语句的最佳方法。

目前,我在控制器中使用以下代码返回特定于单个客户帐户的立场列表。

return _context.Stances
               .ToList()
               .Select(Mapper.Map<Stances, StancesDto>)
               .Where(c => c.AccountGUID == userAccountID.CustomerGUID);

我正在创建一个合作伙伴门户网站,该门户网站允许合作伙伴用户访问许多其他客户帐户,每个客户都提供给他们访问权限。

我设置了一个存储 PartnerGUID 和 CustomerGUID 的 partnerLink 表,以结合关系。我遇到的困难是找到一种方法来允许使用“IN”或“contains”选项建立一对多关系。

我想做的是这样的:

如果只是客户,则加载列表“或”如果是合作伙伴帐户,则加载 partnerLink 表中的所有客户立场。

 var partners = _context.PartnerLinks
                        .Where(user => user.PartnerGUID == userAccountID.CustomerGUID)
                        .Select(user => user.AccountGUID) // extract the emails from users
                        .ToList();

  return _context.Stances
                 .ToList()
                 .Select(Mapper.Map<Stances, StancesDto>)
                 .Where(c => c.AccountGUID == userAccountID.CustomerGUID || partners.Contains(c.AccountGUID));

【问题讨论】:

  • 你知道你已经把整个表加载到内存中了吗?
  • 不,我不知道我正在加载整个表。那是什么部分?
  • ToList 可以立即将整个表加载到内存中。此外,您应该在过滤了要检索的内容后映射到 DTO。一般来说,Select 应该是你做的最后一件事。
  • 你认为你可以尝试更清楚地重写你想要完成的事情吗?
  • 谢谢,我会确保在其他区域也删除它

标签: c# asp.net-mvc linq


【解决方案1】:

在组合 LINQ 查询时不应使用 ToList。一切都应该是 IQueryable。

var partners = _context.PartnerLinks
    .Where(user => user.PartnerGUID == userAccountID.CustomerGUID)
    .Select(user => user.AccountGUID);

return _context.Stances
    .Where(c => c.AccountGUID == userAccountID.CustomerGUID || partners.Contains(c.AccountGUID))
    .AsEnumerable()
    .Select(Mapper.Map<Stances, StancesDto>);

也可以考虑使用 Automapper 的ProjectTo

return _context.Stances
    .Where(c => c.AccountGUID == userAccountID.CustomerGUID || partners.Contains(c.AccountGUID))
    .ProjectTo<StancesDto>(configuration);

【讨论】:

    【解决方案2】:

    我认为您可以使用 Union 来做到这一点。

    有时像:

    return _context.Stances.Select(Mapper.Map<Stances, StancesDto>).Where(c => c.AccountGUID == userAccountID.CustomerGUID)
    .Union(_context.Stances.Select(Mapper.Map<Stances, StancesDto>).Where(c => partners.Contains(c.AccountGUID)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 2020-06-20
      • 1970-01-01
      相关资源
      最近更新 更多