【问题标题】:Proper way to null check in Expression-Tree lambda在 Expression-Tree lambda 中进行空检查的正确方法
【发布时间】:2017-06-05 15:42:01
【问题描述】:

首先,我想原谅自己向其他现有问题发布了类似的问题,但我是 C# 新手,并且才开始掌握 LINQ。 我有一些跨两个表的业务逻辑,它们获取一行的字段。如果不存在这样的行,它应该默认为空字符串。 在 LINQ 之外,这很容易:

var res = SomeClass.foo?.bar ?? "";

但是在 LINQ 中,运算符 ?.?? 不受支持,所以我求助于这个:

     var projectTask = repository.Set<tblProject>().Where(p => includeInactive ||
                            (p.tblOrderStatus.OrderByDescending(s => s.Date).FirstOrDefault().StatusID != StatusIds.Deducted &&
                            p.tblOrderStatus.OrderByDescending(s => s.Date).FirstOrDefault().StatusID != StatusIds.Deduc_RestDecays &&
                            p.tblOrderStatus.OrderByDescending(s => s.Date).FirstOrDefault().StatusID != StatusIds.Cancelled))
                            .Select(p => new {
                                p.ID,
                                p.CustomerID,
                                p.CenterID,
                                p.FrameworkID,
                                p.DeductionmodeID,
                                p.Code,
                                p.Descriptioln,
                                p.StartDate,
                                p.EndDate,
                                Referencetext = p.tblOrderHistories.Where(m => m.OrderReferencetypeID == 1).OrderByDescending(m => m.Date).FirstOrDefault() != null ?
                                p.tblOrderHistories.Where(m => m.OrderReferencetypeID == 1).OrderByDescending(m => m.Date).FirstOrDefault().Referencetext : ""
                            })
                            .ToListAsync();

我做了两次查询,在这种情况下这不会影响性能,但仍然不是很优雅。

我知道您可以通过Expression 构造 LINQ 表达式,但我找不到我的案例的示例。

提前谢谢你。

【问题讨论】:

    标签: c# sql-server linq lambda


    【解决方案1】:

    但在 LINQ 中,运算符 ?.?? 不受支持

    我猜这里的 LINQ 是指针对 IQueryable(在表达式树中)的 LINQ,因为在针对 IEnumerable(带有委托)的 LINQ 中,两者都受支持。

    虽然?. 运算符在表达式树中不受支持(目前),但?? 是完全支持的。

    所以如果问题是针对这个表达式的:

    Referencetext = 
        p.tblOrderHistories.Where(m => m.OrderReferencetypeID == 1)
            .OrderByDescending(m => m.Date).FirstOrDefault() != null ?
        p.tblOrderHistories.Where(m => m.OrderReferencetypeID == 1)
            .OrderByDescending(m => m.Date).FirstOrDefault().Referencetext : ""
    

    通过SelectFirstOrDefault?? 运算符的组合可以轻松处理:

    Referencetext = p.tblOrderHistories
        .Where(m => m.OrderReferencetypeID == 1)
        .OrderByDescending(m => m.Date)
        .Select(m => m.Referencetext)
        .FirstOrDefault() ?? ""
    

    【讨论】:

    • 谢谢!但是.FirstOrDefault() 会返回 null 吗?
    • 对于可为空的类型,绝对是(nullXyzOrDefault 中的 Default 字的意思)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2012-04-05
    • 2018-10-05
    • 1970-01-01
    • 2016-05-10
    • 2020-02-18
    • 2015-08-06
    相关资源
    最近更新 更多