2017-06-05 107 views
1

首先,我想原谅自己发布类似的问题到其他现有的问题,但我是C#的新手,只开始掌握LINQ。 我有一些业务逻辑跨两个表获得一个行的字段。如果不存在这样的行,它应该只是默认为一个空字符串。 外LINQ这很容易:在表达式树中使用null检查的正确方法

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(); 

我哪里查询两次,这ISN”在这种情况下性能不佳,但仍不是很优雅。

我知道你可以通过Expression来构建LINQ表达式,但是我无法完全找到我的例子。

预先感谢您。

回答

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 : "" 

它可以很容易地与Select组合处理,FirstOrDefault??操作:

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

谢谢!但是'.FirstOrDefault()'会返回null吗? – drilow

+0

对于可为null的类型,绝对('null'是'XyzOrDefault'中'Default'字的意思) –

+0

这很有意义,很酷。 – drilow