在需要说== NOT NULL的三元组中返回“NOT NULL”?

问题描述:

鉴于这种代码:在需要说== NOT NULL的三元组中返回“NOT NULL”?

  dataSource = this.db.DailyProductionReportSummaries.Where(
       x => x.ShiftDate >= start && x.ShiftDate <= end && 
       x.Shift == (shift != null ? shift.Code : "SOMETHING ELSE") && //TODO: "SOMETHING ELSE" where it's not null 
       x.LineNumber == (shift != null ? lineNumber : 0) && //TODO: 0 where it's not null 
       x.ProductCode == (productNumber != 0 ? productNumber.ToString() : "SOMETHING ELSE") //TODO: "SOMETHING ELSE" where it's not null 
       ).ToList(); 

我需要在每个标有“TODO”类似(针对专门与//TODO第一线的ternaries地说:

如果shift有东西在里面,返回shift.Code否则,返回将评估为x.Shift == NOT NULL(或更清楚地,它评估为x.shift != null)的“东西”

我在这里只是抱着一个愿望,还是我需要继续前进,并将其扩大为一堆if陈述? (我试图凝聚多个if语句为没有大量的逻辑改变或重写的东西更紧凑,以适应不断变化的配置...

最可读的替代机制扩展到了一堆if声明。请记住,你并不需要拼出每个备选方案,你不需要一堆if嵌套的,你可以通过调用Where反复根本链的过滤器。

var query = this.db.DailyProductionReportSummaries.AsQueryable(); 

query = query.Where(x => x.ShiftDate >= start && x.ShiftDate <= end); 

if (shift == null) 
    query = query.Where(x => x.Shift != null 
          && x.LineNumber != null); 
else 
    query = query.Where(x => x.Shift == shift.Code 
          && x.LineNumber == lineNumber); 

if (productNumber == 0) 
    query = query.Where(x => x.ProductCode != null); 
else 
    query = query.Where(x => x.ProductCode == productNumber.ToString()); 

dataSource = query.ToList(); 
+0

哇靠!我就知道你连锁,但不喜欢那是绝对不可思议的!Imma试试这个,让你知道它是如何工作的! – MetalPhoenix 2015-02-05 16:04:40

+1

@MetalPhoenix请记住,IQueryable的表示“做一个查询”,而不是这样的结果。假设[语义上]等价的最终操作/树如何创建IQueryable基本上是不相关的(EF可以使用可查询的所有限制等)。查看应用查询的实际SQL(即在ToList中)以查看最终发生的事情。 – user2864740 2015-02-05 16:08:26

+0

是的,如果我们总是假定它有一个值(它会),这似乎更多地是我需要的一个轻微的逻辑修改...更容易处理productNumber。这是比我想要完成的更好的解决方案!很容易忘记,这不是实际的结果或行动,而是“做”,因为它由EF分隔。感谢您的提醒。 – MetalPhoenix 2015-02-05 16:12:28