我需要根据他/她的关系编号从特定用户的数据库中获取上个月发票。 我已经提出了下面的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();
我觉得上面的查询可以用更好的方式重写。寻找以更有效的方式重写上述查询的建议。
谢谢!!!
答案 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()
,因此您的选择更具可读性。