我得到了:
非静态方法需要目标。
问题是Status
为空。我不明白为什么,因为有一个条件清楚地表明Status
是否为null返回1
。
var filterstatus = (from bq in basequery
let LastStatus = Status == null ? 1
: ((from sd in ems.SampleDatas
where sd.Reference_id == Status.id
&& sd.DateTimeUTC <= bq.DateTimeUTC
orderby sd.DateTimeUTC
select ((sd.Value >= StatusValue) ? 1 : 0)
).DefaultIfEmpty(1).FirstOrDefault())
select new { bq, LastStatus });
答案 0 :(得分:1)
这是因为它将整个表达式转换为SQL,而不是在内存中进行短路(短路将由数据库处理)。
您可以编写类似这样的内容,这样可以在数据库中正确地进行短路(但仍会生成查询的右侧)。
var statusID = Status == null ? (int?)null : Status.id;
var filterstatus = (from bq in basequery
let LastStatus =
statusID == null ?
1 :
((from sd in ems.SampleDatas
where sd.Reference_id == statusID && sd.DateTimeUTC <= bq.DateTimeUTC
orderby sd.DateTimeUTC
select ((sd.Value >= StatusValue) ? 1 : 0)
).DefaultIfEmpty(1).FirstOrDefault())
select new { bq, LastStatus });
理想情况下,根据Status
,您有两个单独的查询,因为此时已经知道右侧是否需要。