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

时间:2013-09-24 18:50:27

标签: c# linq

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

3 个答案:

答案 0 :(得分: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
              };

答案 1 :(得分:2)

我认为Value cannot be null是来自ArgumentNullException的标准邮件。如果您正在调试,并且展开了错误消息,您将看到导致参数null异常的实际参数名称。

usersAdusersWithSecurityuserRepository是否为空?

编辑:

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

如果你解决了这个问题,那么它应该按照你的预期工作,离开加入和所有。

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

答案 2 :(得分:1)

当您在空变量上执行.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
      };