在需要说== 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();
哇靠!我就知道你连锁,但不喜欢那是绝对不可思议的!Imma试试这个,让你知道它是如何工作的! – MetalPhoenix 2015-02-05 16:04:40
@MetalPhoenix请记住,IQueryable的表示“做一个查询”,而不是这样的结果。假设[语义上]等价的最终操作/树如何创建IQueryable基本上是不相关的(EF可以使用可查询的所有限制等)。查看应用查询的实际SQL(即在ToList中)以查看最终发生的事情。 – user2864740 2015-02-05 16:08:26
是的,如果我们总是假定它有一个值(它会),这似乎更多地是我需要的一个轻微的逻辑修改...更容易处理productNumber。这是比我想要完成的更好的解决方案!很容易忘记,这不是实际的结果或行动,而是“做”,因为它由EF分隔。感谢您的提醒。 – MetalPhoenix 2015-02-05 16:12:28