我对这个linq表达式有疑问:
var invs = ids.Split(new[] {'|'}, StringSplitOptions.RemoveEmptyEntries)
.Select(x => sitecoreContext.GetItem<Inv>(new ID(x).Guid))
.ToList();
如何检查.Select中是否为null? SitecoreContext.GetItem(new ID(x).Guid))崩溃(因为未发布或创建但未发布的项目),因此我需要一种方法来首先验证该项目是否存在,然后再进行选择。>
谢谢。
答案 0 :(得分:2)
调用SitecoreContext.GetItem<T>
时,在后台SitecoreContext
从数据库中获取项目,然后将其转换为T类型。而且据我所知,如果没有具有指定ID的项目,它将引发异常。
为避免此异常,您可以采取的措施是拆分SitecoreContext
所做的事情,并在之间进行空值检查的情况下自行执行:
GetItem
var invs = ids.Split(new[] {'|'}, StringSplitOptions.RemoveEmptyEntries)
.Select(x => sitecoreContext.Database.GetItem(new ID(x)))
.Where(x => x != null)
.Select(x => sitecoreContext.Cast<Inv>(x))
.ToList();
答案 1 :(得分:2)
您可以使用where
语句过滤所有非空项目。
var nonNull = list.Where(element => element != null);
我通常为此使用扩展方法:
public static class EnumerableExtensions
{
public static IEnumerable<T> WhereNotNull<T>(this IEnumerable<T> enumerable)
where T: class
{
return enumerable.Where(element => element != null);
}
}
给出您的示例,您可以使用如下语句:
var invs = ids.Split(new[] {'|'}, StringSplitOptions.RemoveEmptyEntries)
.WhereNotNull()
.Select(x => sitecoreContext.GetItem<Inv>(new ID(x).Guid))
.ToList();
答案 2 :(得分:0)
您可以在Linq示例中使用空合并运算符或三元运算符检查Null,如下所示
`var productTypes = from ProductDto e in Product
select new
{
Id = e.Product != null ? e.Product.ID : 0,
Name = "xyz"
};`