良好的linq查询方法来编写基于DateTime子句的查询

时间:2012-12-13 08:04:02

标签: sql linq linq-to-entities

我需要根据他/她的关系编号从特定用户的数据库中获取上个月发票。 我已经提出了下面的linq查询。

//步骤1:根据关系编号和OrderByDescending子句提取帐单编号
**

var query = context.Billings 

 .OrderByDescending(c => c.BillGenerationDate)
                               .Where(c => c.CAFNO == caf)
                               .Select(c => c.BillNo)
                               .FirstOrDefault();

** //第2步:第1步结果的帐号是最后一次(或最高)按// BillGeneration日期过滤

var bill = (from b in context.Billings
                            where b.BillNo == query
                            select b).FirstOrDefault();

第2步将导致所需的完整账单信息。

OR

其他方式:

var myresult = (from c in context.Billings
                            where c.CAFNO == caf
                            orderby c.BillGenerationDate descending
                            select c).FirstOrDefault();

我觉得上面的查询可以用更好的方式重写。寻找以更有效的方式重写上述查询的建议。

谢谢!!!

1 个答案:

答案 0 :(得分:0)

由于BillGenerationDate可以为空而更新

您当前的查询会为您提供最后的结算信息,而不是前几个月的发票。为了简单地获得上个月,您可以执行以下操作。

var invoice = context.Billings
                     .FirstOrDefault( 
                         c => c.CAFNO == caf && 
                              (c.BillGenerationDate ?? new DateTime()).AddMonths(1).Month == DateTime.Now.Month &&
                              (c.BillGenerationDate ?? new DateTime()).AddMonths(1).Year == DateTime.Now.Year)

但是,如果您每月有多张发票,则无法保证任何订单,您可以再次在订购短语中添加。

var invoice = context.Billings
                     .OrderByDescending(c => c.BillGenerationDate)
                     .FirstOrDefault( 
                         c => c.CAFNO == caf && 
                              (c.BillGenerationDate ?? new DateTime()).AddMonths(1).Month == DateTime.Now.Month &&
                              (c.BillGenerationDate ?? new DateTime()).AddMonths(1).Year == DateTime.Now.Year)

注意:这与上面的第二个查询(除了额外的月份过滤器)没有任何不同,因为FirstOrDefault(Func<T,Bool)重载的行为类似于撰写的Where(Func<T,Bool>).FirstOrDefault(),因此您的选择更具可读性。