Mar*_*ain 8 .net c# entity-framework
我正在使用.NET和实体框架.我希望按照没有时间部分的日期对表进行分组.
我上课了:
public sealed class QueryItem {
public int Year { get; set; }
public int Month { get; set; }
public int Day { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和方法(我正在使用BLToolkit,如果你想知道什么是DbManager):
protected override IQueryable<QueryItem> InitiateQuery() {
return
from query in DbManager.GetTable<SomeTableModel>()
group query by new { Year = query.CreationDate.Year, Month = query.CreationDate.Month, Day = query.CreationDate.Day }
into list1
select new QueryItem {Year = list1.Key.Year, Month = list1.Key.Month, Day = list1.Key.Day};
}
Run Code Online (Sandbox Code Playgroud)
在这个方法中,linq翻译成了这个SQL查询:
SELECT
[query].[CreationDate]
FROM
[SomeDatabase.SomeTable] [query]
GROUP BY
DatePart(Year, [query].[CreationDate]),
DatePart(Month, [query].[CreationDate]),
DatePart(Day, [query].[CreationDate]),
[query].[CreationDate]
Run Code Online (Sandbox Code Playgroud)
这是错误的查询,因为它不仅仅按日期分组.
但是如果我使用这段代码(它不可用,我需要返回一个类对象):
var result =
from query in DbManager.GetTable<SomeTableModel>()
group query by new { Year = query.CreationDate.Year, Month = query.CreationDate.Month, Day = query.CreationDate.Day }
into list1
select list1;
Run Code Online (Sandbox Code Playgroud)
它将被翻译成:
SELECT
[t1].[c1] as [c11],
[t1].[c2] as [c21],
[t1].[c3] as [c31]
FROM
(
SELECT
DatePart(Year, [selectParam].[CreationDate]) as [c1],
DatePart(Month, [selectParam].[CreationDate]) as [c2],
DatePart(Day, [selectParam].[CreationDate]) as [c3]
FROM
[SomeDatabase.SomeTable] [selectParam]
) [t1]
GROUP BY
[t1].[c1],
[t1].[c2],
[t1].[c3]
Run Code Online (Sandbox Code Playgroud)
这是正确的查询.
我想实体框架试图优化我的查询或类似的东西,这就是为什么我有错误的查询.
我对吗?我是以正确的方式做到的吗?我该怎么办(可能使用直接SQL查询或其他东西)?
在这里使用EntityFunctions*要简单得多:
var result =
from query in DbManager.GetTable<SomeTableModel>()
group query by EntityFunctions.TruncateTime(query.CreationDate)
into list1
select list1;
Run Code Online (Sandbox Code Playgroud)
*实体框架6中的DbFunctions.
更新答案: EntityFunctions
已弃用。
警告 1 'System.Data.Entity.Core.Objects.EntityFunctions' 已过时:'此类已被 System.Data.Entity.DbFunctions 取代。c:\users\liufa\documents\visual studio 2013\Projects\MatasMrLenderTest\Mvc5MobileApplication1\Controllers\CreditScoreController.cs 32 103 Mvc5MobileApplication1
现在是DbFunctions
。
using System.Data.Entity;
var result = DbManager.GetTable<SomeTableModel>()
.GroupBy(o => DbFunctions.TruncateTime(o.CreationDate))
Run Code Online (Sandbox Code Playgroud)