转义空值LINQ

时间:2018-07-31 10:48:05

标签: linq sitecore

我对这个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))崩溃(因为未发布或创建但未发布的项目),因此我需要一种方法来首先验证该项目是否存在,然后再进行选择。

谢谢。

3 个答案:

答案 0 :(得分:2)

调用SitecoreContext.GetItem<T>时,在后台SitecoreContext从数据库中获取项目,然后将其转换为T类型。而且据我所知,如果没有具有指定ID的项目,它将引发异常。

为避免此异常,您可以采取的措施是拆分SitecoreContext所做的事情,并在之间进行空值检查的情况下自行执行:

  1. 先执行GetItem
  2. 进行空检查
  3. 将项目投射到您的类型:
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"
                   };`