【问题标题】:Last 6 Payments最近 6 笔付款
【发布时间】:2016-09-11 23:23:24
【问题描述】:

我需要从仅包含以下内容的架构中获取最后六笔付款

贡献 ID 截止日期 金额

付款跨越 7 年,我只需要获得最近的六笔付款,我认为这会按照我的 sql 完成

SELECT TOP 6 [ID]
  ,[customerInfo]
  ,[IVACODE]
  ,[Contribution]
  ,[DUE_DATE]
  ,[isActive]
  ,[isDeleted]
FROM [portal].[dbo].[tblPortalContributionSchedule]
where customerInfo='01F6B68B-6FC2-4F9D-B586-6934B8D6C979'
and DUE_DATE <='2016/09/26' 
ORDER BY DUE_DATE DESC

Linq 版本

List<tblPortalContributionSchedule> _contributions 
    = portalEntities.tblPortalContributionSchedules
            .Where(a => a.customerInfo == _customerId 
                        && a.isDeleted == false 
                        && a.DUE_DATE <=Convert.ToDateTime("2016/09/26"))
            .Take(6)
            .OrderByDescending(o => o.DUE_DATE)
            .ToList();

foreach (var contribution in _contributions)
{

            AllPayments.Add(new Payments(contribution.ID, Convert.ToDecimal(contribution.Contribution), Convert.ToDateTime(contribution.DUE_DATE), false));

}

但它不会产生与以下相同的结果

对不起,我需要 linq 中的答案,我不需要的是正确的方法,我得到的比预期的要少

编辑 1 这是我到目前为止的查询,但我仍然没有得到与我的 sql 脚本相同的结果

 List<tblPortalContributionSchedule> _contributions = 
portalEntities.tblPortalContributionSchedules.Where(a => a.customerInfo == 
_customerId && a.isDeleted == false && a.DUE_DATE 
<=Convert.ToDateTime("2016/09/26")).OrderByDescending(o => 
o.DUE_DATE).Take(6).ToList();

编辑 2
展示我在视频中展示的代码

    public List<Payments> getAllPayments(Guid _customerId)

    {
        List<Payments> AllPayments = new List<Payments>();

        List<tblPortalPayment> _payments = portalEntities.tblPortalPayments.Where(a => a.CustomerId == _customerId && a.isDeleted == false).ToList();

        foreach (var payment in _payments)
        {
            AllPayments.Add(new Payments(payment.id, Convert.ToDecimal(payment.paymentDue), Convert.ToDateTime(payment.paymentDate), Convert.ToBoolean(payment.isinArrears)));

        }

  List<tblPortalContributionSchedule> _contributions = portalEntities.tblPortalContributionSchedules.Where(a => a.customerInfo == _customerId && a.isDeleted == false && a.DUE_DATE<= Convert.ToDateTime("2016/09/26")).OrderByDescending(o => o.DUE_DATE).Take(6).ToList();
        foreach (var contribution in _contributions)
        {

            AllPayments.Add(new Payments(contribution.ID, Convert.ToDecimal(contribution.Contribution), Convert.ToDateTime(contribution.DUE_DATE), false));

        }


        var result = AllPayments.OrderByDescending(o => o.paymentDate).ToList(); 

        return AllPayments.OrderByDescending(o => o.paymentDate).ToList();

    }      

【问题讨论】:

  • 有什么区别?
  • Take 应该在OrderByDescending 之后
  • 你是得到更多的记录还是记录的顺序有问题??
  • @IvanStoev 你能解释一下为什么会这样
  • 因为这就是您的 SQL TOP 查询的工作方式 - 首先对数据进行过滤、排序,然后获取前排序的 6 条记录。

标签: entity-framework linq


【解决方案1】:

您可以如下图所示试一试,然后告诉我们结果。

var dueDateFilter = new DateTime(2016, 09, 26);

List<tblPortalContributionSchedule> _contributions = 
    portalEntities.tblPortalContributionSchedules
        .Where(a => a.customerInfo == _customerId 
            && a.isDeleted == false 
            && a.DUE_DATE <= dueDateFilter)
        .OrderByDescending(o => o.DUE_DATE)
        .Take(6)
        .ToList();

【讨论】:

  • 如果你看到我的方法是 getallpayments 我会通过日期参数传递它,我将如何最好地进行参数化,这仍然有效吗?
  • 你的意思是像这样a.DUE_DATE&lt;= new DateTime(2016, 09, 26) 吗?如果是,那么它也应该这样工作。
  • 基本上我需要日期过滤器是第一个查询的最新日期,如果这样的话?这是我试图展示的六个月的付款
  • 是的,你也可以这样做。希望这对另一个问题有好处,不是吗? :D
  • 不,我的意思是它会更像这样 a.due_date =
【解决方案2】:


尝试使用此查询

SELECT [ID],
 [customerInfo],
 [IVACODE],
 [Contribution],
 [DUE_DATE],
 [isActive],
 [isDeleted]
 FROM [portal].[dbo].[tblPortalContributionSchedule]
 where customerInfo='01F6B68B-6FC2-4F9D-B586-6934B8D6C979'
 and ROWNUM <= 6
 ORDER BY DUE_DATE DESC

【讨论】:

  • 吉姆我应该更清楚我想得到最近的,不管是什么日期,但也可以在 linq 中!
猜你喜欢
  • 1970-01-01
  • 2015-10-02
  • 2018-05-30
  • 2012-09-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 2018-10-14
  • 2015-11-01
相关资源
最近更新 更多