执行自联接时没有数据返回

时间:2014-08-09 02:51:59

标签: c# sql linq self-join

我有一张表格,其中包含代理商的付款记录。我想将每个代理商的总付款总额分为2列,第一个是当天付款,第二个是付款前一天。

所以我尝试这样的SQL。

select p1.UserName, p1.PaymentAmount, p2.PaymentAmount
from vw_Agency_Payment p1
join vw_Agency_Payment p2 on p1.UserName=p2.UserName
where p1.PaymentDate = '2014-08-07'
  and p2.PaymentDate = '2014-08-08'

成功并返回数据。

但是当我将它转换为Linq时如下:

var yesterday = DateTime.Today.AddDays(-1);
var tomorrow = DateTime.Today.AddDays(1);

var agencyPayment = from y in db2.vw_Agency_Payment
                    join t in db2.vw_Agency_Payment on y.UserName equals t.UserName
                    where y.PaymentDate >= yesterday
                       && y.PaymentDate < DateTime.Today
                       && t.PaymentDate >= DateTime.Today
                       && t.PaymentDate < tomorrow
                    select new AgencyPaymentModel
                               {
                                   agencyUserCode = y.UserName,
                                   yesterdayPayment = y.PaymentAmount,
                                   todayPayment = t.PaymentAmount,
                                   growth = (t.PaymentAmount - y.PaymentAmount) / y.PaymentAmount * 100
                               };

return View(agencyPayment.OrderByDescending(c => c.growth).Take(100).ToList());

它不返回任何数据。 我不知道是什么原因造成的!?

2 个答案:

答案 0 :(得分:1)

为什么不使用以下代码(将日期时间段视为日期时间字段)?

var yesterday = DateTime.Today.AddDays(-1);

var agencyPayment = from y in db2.vw_Agency_Payment
                    join t in db2.vw_Agency_Payment on y.UserName equals t.UserName
                    where y.PaymentDate.Date = yesterday
                       && t.PaymentDate.Date = DateTime.Today
                    select new AgencyPaymentModel
                               {
                                   agencyUserCode = y.UserName,
                                   yesterdayPayment = y.PaymentAmount,
                                   todayPayment = t.PaymentAmount,
                                   growth = (t.PaymentAmount - y.PaymentAmount) / y.PaymentAmount * 100
                               };

return View(agencyPayment.OrderByDescending(c => c.growth).Take(100).ToList());

答案 1 :(得分:0)

 where y.PaymentDate >= yesterday
                   && y.PaymentDate < DateTime.Today
                   && t.PaymentDate >= DateTime.Today
                   && t.PaymentDate < tomorrow
  

没有结果会满足这个条件:

     

从第1-2行开始,PaymentDate仅限于昨天......与第3行相交将缩小至零。

     

基本上你需要绘制一个合理的范围。

     

另外,代码段2包含的逻辑多于代码段1,您应该在相同条件下测试它们。