Конвертировать SQL-оператор в linq - используя datepart и группировку

1

SQL ниже возвращает количество записей, обновляемых по неделям.
Я воссоздал в linq часть, возвращающую счет за неделю (ниже), но я не могу получить столбцы startofweek и endofweek. Помогите

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();
  • 0
    Как примечание, эти запросы будут настолько медленными, насколько это возможно. Ваше высказывание where и group by не является допустимым .
  • 2
    Когда вы используете LINQ для запроса DB вы должны сообщить нам о конкретной используемой вами технологии, такой как LINQ2SQL или LINQ2Entities .
Показать ещё 2 комментария
Теги:
linq
linq-to-entities

2 ответа

1

Друг дал мне ответ, в котором я нуждался. Результаты совпадали с моими выводами 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)
            });
1

Этот запрос Linq2Entities предоставит вам startofweek и endofweek. Однако для больших списков вы можете увидеть проблемы с производительностью при таких расчетах.

Это позволяет использовать EntityFunctions.CreateDateTime для расчета дат по годам и неделям.

Linq Query:

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", это не должно быть проблемой для вас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню