[英]Convert sql statement to linq - using datepart and grouping
下面的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();
此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"
,這對您來說不是問題。 一位朋友給了我所需的答案。 結果與我的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.