正确的方法来检查表达式树lambda

时间:2017-06-05 15:42:01

标签: c# sql-server linq lambda

首先,我想原谅自己向其他现有问题发布类似的问题,但我是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表达式,但我无法找到我的案例。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

  

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

我想在LINQ这里你的意思是LINQ对IQueryable(内部表达式树),因为在LINQ中对IEnumerable(有委托)都支持。

虽然你在表达式树中尚未支持?.运算符,但完全支持??

所以,如果问题出在这个表达式上:

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() ?? ""