5

我有以下 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 所示)?

4

3 回答 3

2
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
              };
于 2013-09-24T18:55:10.753 回答
2

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

usersAd, usersWithSecurity, 中的任何一个是否为userRepository空?

编辑:

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

如果你解决了这个问题,它应该像你期望的那样工作,离开加入等等。

usersWithSecurity = usersWithSecurity ?? Enumerable.Empty<User>(); // or similar
于 2013-09-24T18:57:30.813 回答
1

当您.ToLower()在空 var 上执行时,您的问题肯定会发生。我建议避免在循环中进行隐藏的字符串分配(在您的情况下,在您的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
      };
于 2013-09-24T19:01:15.560 回答