【问题标题】:How to use Entity Framework group date not date with time and sum total where condition如何在条件下使用实体框架组日期而不是时间日期和总和
【发布时间】:2021-12-26 02:09:21
【问题描述】:

我有这张桌子

CREATE TABLE Receipt
(
    id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    idcustom INT NULL,
    idstaff INT NULL,
    payat DATETIME NOT NULL,
    totalINT NOT NULL
)

我有一个 SQL 查询:

SELECT 
    CAST(payat AS date), SUM(total)
FROM
    Receipt
WHERE
    CAST(payat AS date) = '2021-11-13'
GROUP BY 
    CAST(payat AS date)

如何在实体框架中选择这个查询?

【问题讨论】:

  • 支点:使用payat >= '2021-11-13' AND payat < '2021-11-14' 比使用CAST(payat AS date) = '2021-11-13' 更有效。此外,您不需要GROUP BY,因为只有一个值,您同样可以将其省略并执行SELECT CAST(MIN(payat) AS date)

标签: c# .net entity-framework


【解决方案1】:

应该是这样的

var result =  dbContext.Receipt
    .Select(p=> new  { 
            payat =  p.payat.Date,
            total =  p.total 
           })
    .GroupBy(p => p.payat )
    .Select(p => new {
        payat = p.Key,
        total = p.Sum(q => q.total)
    }).ToList();

【讨论】:

    【解决方案2】:

    EF 中的确切等价物是

    var result =
        from r in context.Receipt
        where payat.Date = new DateTime(2013, 11, 13)
        group r by r.payat.Date into g
        select new {
            date = g.Key,
            total = g.Sum(r => r.total),
        };
    

    然而,一个更有效的解决方案出现了(等效的 SQL 也是如此)

    var result =
        new {
            date = new DateTime(2013, 11, 13),
            total =
               (from r in context.Receipt
                where payat >= new DateTime(2013, 11, 13)
                   && payat < new DateTime(2013, 11, 14)
                select r.total
               ).Sum(),
        };
    

    换句话说,不要对日期使用函数,而是使用开始和结束日期范围进行比较。而且这里不需要分组,因为我们只有一个日期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      相关资源
      最近更新 更多