林奇让,如果

时间:2016-02-18 22:36:13

标签: c# linq

我得到了:

  

非静态方法需要目标。

问题是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 });

1 个答案:

答案 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,您有两个单独的查询,因为此时已经知道右侧是否需要。