尝试从空集合中进行选择时的 LINQ 查询问题
本文关键字:选择 LINQ 问题 查询 行选 空集 集合 | 更新日期: 2023-09-27 18:32:49
我有以下 LINQ 查询,它从 2 个集合中提取最终结果集:usersAd
和 usersWithSecurity
:
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 所示)?
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 异常的实际参数名称。
usersAd
、usersWithSecurity
、userRepository
中的任何一个都是空的吗?
编辑:
好的,在您的评论中提供了更多信息,我现在看到了这个问题。 usersWithSecurity
为空,不可能为空。 source
参数是在 Enumerable
类和Queryable
类中找到的所有扩展方法中的源IEnumerable
或IQueryable
的名称。
如果您修复了这个问题,它应该按预期工作,左联接和所有。
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
};