현재 선택된 날짜로 결과를 그룹화하는 쿼리를 실행하고 싶습니다.
이 예제에서는 다음과 같은 간단한 모델을 상상해보십시오.
public class User
{
public DateTime LastLogIn {get; set;}
public string Name {get; set;}
}
내가 찾고있는 솔루션은 Date로 로그인 한 사용자 수를 얻는 것입니다. 데이터베이스에서 DateTime은 날짜 및 시간 구성 요소와 함께 저장되지만이 쿼리에 대해서는 날짜 만 신경 씁니다.
내가 현재 가지고있는 것은 이것이다.
context.Users
.Where((x.LastLogIn >= lastWeek)
&& (x.LastLogIn <= DateTime.Now))
.GroupBy(x => EntityFunctions.TruncateTime(x.LastLogIn))
.Select(x => new
{
Value = x.Count(),
Day = (DateTime)EntityFunctions.TruncateTime(x.Key)
}).ToList();
위의 경우 그러나 빈 목록을 반환합니다.
최종 목표는 Value (하루에 로그인 한 사용자 수)와 Day (해당 날짜)를 포함하는 객체 목록을 갖는 것입니다.
이견있는 사람?
쿼리를 다음으로 변경하면 :
context.Users
.Where((x.LastLogIn >= lastWeek)
&& (x.LastLogIn <= DateTime.Now))
.GroupBy(x => EntityFunctions.TruncateTime(x.LastLogIn))
.Select(x => new
{
Value = x.Count(),
Day = (DateTime)x.Key
}).ToList();
이제는 하나의 항목이있는 목록을 반환합니다. 여기서 값은 where 절과 일치하는 총 사용자 수이고 그날은 첫날입니다. 아직까지 그룹화 할 수 없었던 것 같습니다.
노트:위의 코드가 옳다는 것을 알았습니다. 나는 다른 것을 잘못하고있었습니다.
그것을 생성하는 SQL은 (예 : 여기에 나와있는 예제와 함께 아주 약간의 구문 오류가있을 수 있습니다.)
SELECT
1 AS [C1],
[GroupBy1].[A1] AS [C2],
CAST( [GroupBy1].[K1] AS datetime2) AS [C3]
FROM ( SELECT
[Filter1].[K1] AS [K1],
COUNT([Filter1].[A1]) AS [A1]
FROM ( SELECT
convert (datetime2, convert(varchar(255), [Extent1].[LastLogIn], 102) , 102) AS [K1],
1 AS [A1]
FROM [dbo].[Users] AS [Extent1]
WHERE (([Extent1].[LastLogIn] >= @p__linq__1) AND ([Extent1].[LastLogIn] <= @p__linq__2)
) AS [Filter1]
GROUP BY [K1]
) AS [GroupBy1]
두 번째는 필요 없습니다.TruncateTime
거기에:
context.Users
.Where((x.LastLogIn >= lastWeek) && (x.LastLogIn <= DateTime.Now))
.GroupBy(x => DbFunctions.TruncateTime(x.LastLogIn))
.Select(x => new
{
Value = x.Count(),
// Replace the commented line
//Day = (DateTime)DbFunctions.TruncateTime(x.Key)
// ...with this line
Day = (DateTime)x.Key
}).ToList();
그만큼GroupBy
시간이DateTime
이미 다시 전화 할 필요가 없습니다.
쓰다DbFunctions.TruncateTime
어셈블리를 참조해야합니다.System.Data.Entity
포함using System.Data.Entity;
노트 :비추천에 대한 수정 사항EntityFunctions
.
.GroupBy(x => EntityFunctions.TruncateTime(x.LastLogIn))
날짜 별 그룹화를 고려할 때 중요한 요소입니다. - sandeep talabathula
이 시도:
.GroupBy(x => new {Year = x.LastLogIn.Year, Month = x.LastLogIn.Month, Day = x.LastLogIn.Day)
.Select(x => new
{
Value = x.Count(),
Year = x.Key.Year,
Month = x.Key.Month,
Day = x.Key.Day
})
당신은 쉽게 할 수 있습니다 :
yourDateList.GroupBy(i => i.ToString("yyyyMMdd"))
.Select(i => new
{
Date = DateTime.ParseExact(i.Key, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None),
Count = i.Count()
});
한 줄로 입력 할 수도 있습니다.
var b = (from a in ctx.Candidates select a)
.GroupBy(x => x.CreatedTimestamp.Date).Select(g => new { Date=(g.Key).ToShortDateString(), Count = g.Count() });
GroupBy
똑바로Count()
? - dasblinkenlightDay = (DateTime)EntityFunctions.TruncateTime(x.Key)
와Day = x.Key
? 날짜가 그룹화를 위해 이미 잘 렸기 때문에 동일해야합니다. - dasblinkenlight