簡體   English   中英

將SQL語句轉換為LINQ-使用datepart和分組

[英]Convert sql statement to linq - using datepart and grouping

下面的SQL返回按周更新的記錄數。
我已經重新在LINQ返回由一周(下同)計的一部分,但我不能讓startofweekendofweek列。 救命

SQL

select 
DATEPART(wk, audit_date) week, 
count(audit_date) updatedRec, 

dateadd (week, DATEPART(wk, audit_date),  dateadd (year, DATEPART(year, audit_date)-1900, 0)) - 4 -  datepart(dw, dateadd (week, DATEPART(wk, audit_date),  dateadd (year, DATEPART(year, audit_date)-1900, 0)) - 4) + 1 startofweek,


dateadd (week, DATEPART(wk, audit_date), dateadd (year, DATEPART(year, audit_date)-1900, 0)) - 4 - datepart(dw, dateadd (week, DATEPART(wk, audit_date), dateadd (year, DATEPART(year, audit_date)-1900, 0)) - 4) + 7 endofweek

from itims.Listings_Audit
where audit_type = 'U' and datepart(year,audit_date) = '2014'
Group by DATEPART(wk, audit_date),  DATEPART(year, audit_date)
order by startofweek, week

LINQ

    var data = (from p in _db.Listings_Audit
            where p.audit_type == "U"
            where p.audit_date.Value.Year == 2014
            group p by new
            {
                Column1 = (int?) SqlFunctions.DatePart("wk", p.audit_date),
                Column2 = (int?) SqlFunctions.DatePart("year", p.audit_date)
            }
            into g
            select new
            {
                week = g.Key.Column1,
                updatedRecCnt = g.Count(p => p.audit_date != null),


            }).OrderBy(g=>g.week).ToList();

此Linq2Entities查詢將為您提供startofweekendofweek 但是,對於大型列表,您可能會在此類計算中看到性能問題。

這利用EntityFunctions.CreateDateTime來基於年和周來計算日期。

Linq查詢:

var data = (
    from p in _db.Listings_Audit
    group p by
        new
        {
            Column1 = (int)SqlFunctions.DatePart("wk", p.audit_date),
            Column2 = (int)SqlFunctions.DatePart("year", p.audit_date)
        }
    into g
    select
        new
        {
            week = g.Key.Column1,
            year = g.Key.Column2,
            startOfWeek =
                EntityFunctions.AddDays(
                    EntityFunctions.CreateDateTime(g.Key.Column2, 1, 1, 0, 0, 0),
                    (7 * (g.Key.Column1 - 1))),
            endOfWeek =
                EntityFunctions.AddDays(
                    EntityFunctions.CreateDateTime(g.Key.Column2, 1, 1, 0, 0, 0),
                    (7 * (g.Key.Column1))),
            updatedRecCnt = g.Count(p => p.CreatedDate != null),
        }).OrderBy(g => g.startOfWeek).ToList();
  • 注意:如果您的行包含null日期,則需要使用GetValueOrDefault() 但是,根據您的示例將其限制為"2014" ,這對您來說不是問題。

一位朋友給了我所需的答案。 結果與我的sql輸出匹配。

var data = (from p in _db.Listings_Audit
                    where p.audit_type == "U"
                    where p.audit_date.Value.Year == 2014
                    group p by new
                    {
                        Column1 = (int?)SqlFunctions.DatePart("wk", p.audit_date),
                        Column2 = (int?)SqlFunctions.DatePart("year", p.audit_date)
                    }
                        into g
                        select new
                        {
                            week = g.Key.Column1,
                            updatedRecCnt = g.Count(p => p.audit_date != null),
                            year = g.Key.Column2

                        }).OrderBy(g => g.week).ToList().Select(y => new
            {
                week = y.week,
                y.updatedRecCnt,
                startofweek = new DateTime(y.year.Value, 1, 1).AddDays(-(int)new DateTime(y.year.Value, 1, 1).DayOfWeek).AddDays(y.week.Value * 7 - 7),
                endofweek = new DateTime(y.year.Value, 1, 1).AddDays(y.week.Value * 7 - 1).AddDays(-(int)new DateTime(y.year.Value, 1, 1).DayOfWeek)
            });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM