尝试从空集合中进行选择时的 LINQ 查询问题

本文关键字:选择 LINQ 问题 查询 行选 空集 集合 | 更新日期: 2023-09-27 18:32:49

我有以下 LINQ 查询,它从 2 个集合中提取最终结果集:usersAdusersWithSecurity

var results = from usrAd in usersAd
              from usrRepo in usersWithSecurity
                             .Where(x => usrAd.Value.ToLower() == x.Value.ToLower())
                             .DefaultIfEmpty()
      select new User(userRepository)
      {
        ID = usrRepo == null ? null : usrRepo.ID,
        Value = usrAd.Value,
        FullName = usrAd.FullName
      };

问题是我不断收到以下错误:Value cannot be null.

我知道问题是usersWithSecurity集合是空的。我添加了".DefaultIfEmpty()' 在最后,但它仍然产生异常。

如何修改我的 LINQ 语句以继续并从usersAd返回所有内容,并从usersWithSecurity返回项目(如果存在且值匹配)(如 lambda 所示)?

尝试从空集合中进行选择时的 LINQ 查询问题

var usersWithSecurity = _biz.getUsersWithSecurity() ?? new List<User>();
var results = from usrAd in usersAd
              from usrRepo in usersWithSecurity
              where usrAd.Value.ToLower() == usrRepo.Value.ToLower()
              select new User(userRepository)
              {
                  ID = usrRepo == null ? null : usrRepo.ID,
                  Value = usrAd.Value,
                  FullName = usrAd.FullName
              };

我相信Value cannot be null是来自ArgumentNullException的标准消息。 如果正在调试,并展开错误消息,则会看到导致参数 null 异常的实际参数名称。

usersAdusersWithSecurityuserRepository中的任何一个都是空的吗?

编辑:

好的,在您的评论中提供了更多信息,我现在看到了这个问题。 usersWithSecurity为空,不可能为空。 source 参数是在 Enumerable 类和Queryable类中找到的所有扩展方法中的源IEnumerableIQueryable的名称。

如果您修复了这个问题,它应该按预期工作,左联接和所有。

usersWithSecurity = usersWithSecurity ?? Enumerable.Empty<User>(); // or similar
当您

在空变量上执行.ToLower()时,肯定会出现问题。我建议避免在循环中隐藏字符串分配(在您的情况下,在您的Where中)。请改用String.Compare()

下面是使用代码的示例。

var results = from usrAd in usersAd
      from usrRepo in usersWithSecurity.Where(x => string.Equals(usrAd.Value, x.Value, StringComparison.OrdinalIgnoreCase))
      select new User(userRepository)
      {
        ID = usrRepo == null ? null : usrRepo.ID,
        Value = usrAd.Value,
        FullName = usrAd.FullName
      };