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();
Друг дал мне ответ, в котором я нуждался. Результаты совпадали с моими выводами 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)
});
Этот запрос Linq2Entities предоставит вам startofweek и endofweek. Однако для больших списков вы можете увидеть проблемы с производительностью при таких расчетах.
Это позволяет использовать EntityFunctions.CreateDateTime для расчета дат по годам и неделям.
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"
, это не должно быть проблемой для вас.
LINQ
для запросаDB
вы должны сообщить нам о конкретной используемой вами технологии, такой какLINQ2SQL
илиLINQ2Entities
.