在linq查询中有条件地填充匿名类型成员
本文关键字:类型 成员 填充 linq 查询 有条件 | 更新日期: 2023-09-27 18:04:50
我有一个问题与以下LINQ查询。当嵌套查询(item.Items)没有对象时,我得到异常"值不能为空"。参数名称:source.".
如何让内部查询返回一个空列表到查询中的项目?
var items = from item in _repository.GetStreamItems()
select new
{
Title = item.Title,
Description = item.Description,
MetaData = item.MetaData,
ItemType = item.ItemType,
Items = from subItem in item.Items
select new
{
Title = subItem.Title,
Description = subItem.Description,
MetaData = subItem.MetaData,
ItemType = subItem.ItemType
}
};
下面是使用方法调用而不是查询语法编写的相同查询。同样的问题:
var items = _repository.GetStreamItems()
.Select(x => new { Title = x.Title, Description = x.Description, MetaData = x.MetaData, ItemType = x.ItemType,
Items = x.Items.Select(x2 => new { Title = x2.Title, Description = x2.Description, MetaData = x2.MetaData, ItemType = x2.ItemType,
Items = x2.Items.Select(x3 => new { Title = x3.Title, Description = x3.Description, MetaData = x3.MetaData, ItemType = x3.ItemType }) }) });
关于如何测试或避免null项的任何想法。物品价值?我总觉得我错过了一些简单的东西。
假设它是LINQ到对象,单个项目类名称是Item
,使用这个:
var items = from item in _repository.GetStreamItems()
select new
{
Title = item.Title,
Description = item.Description,
MetaData = item.MetaData,
ItemType = item.ItemType,
Items = from subItem in (item.Items ?? Enumerable.Empty<Item>())
select new
{
Title = subItem.Title,
Description = subItem.Description,
MetaData = subItem.MetaData,
ItemType = subItem.ItemType
}
};
??
称为空合并运算符,如果左边的值是null
,则返回右边的值。
在您的特定示例中,我们提供一个空序列而不是null
,以便代码不会崩溃。
问题是你不能将查询应用于null
对象,似乎item.Items
可以在你的情况下成为null
。更好的解决方案是确保Items
属性在为空时返回零序列,而不是null
。
如果您无法控制StreamItem
类,但必须在许多地方执行类似的查询,那么创建一个"安全"的扩展方法可能会得到回报,该方法将返回"无效"项:
public static IEnumerable<Item> SafeGetSubItems(this StreamItem parent)
{
return parent.Items ?? Enumerable.Empty<Item>();
}
这将允许你总是写:
Items = from subItem in item.SafeGetSubItems()
select new
{
// ...
}