首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架:按月高效分组

实体框架:按月高效分组
EN

Stack Overflow用户
提问于 2012-03-27 16:53:27
回答 3查看 15.7K关注 0票数 12

我对此做了一些研究,到目前为止,我发现最好的方法是在整个dataset上使用Asenumerable,这样过滤就发生在linq to objects中,而不是在DB上。我用的是最新的EF。

我的工作(但非常慢)代码是:

代码语言:javascript
复制
        var trendData = 
            from d in ExpenseItemsViewableDirect.AsEnumerable()
            group d by new {Period = d.Er_Approved_Date.Year.ToString() + "-" + d.Er_Approved_Date.Month.ToString("00") } into g
            select new
            {
                Period = g.Key.Period,
                Total = g.Sum(x => x.Item_Amount),
                AveragePerTrans = Math.Round(g.Average(x => x.Item_Amount),2)
            };

这给了我YYYY-MM格式的月份,以及总金额和平均金额。但是,每次都需要几分钟。

我的另一个解决方法是在SQL中执行update查询,这样我就有了一个YYYYMM字段作为本机分组依据。然而,更改DB并非易事,因此如果您有任何建议,我们将不胜感激。

我找到上面的代码想法的线程(http://stackoverflow.com/questions/1059737/group-by-weeks-in-linq-to-entities)提到了‘等到.NET 4.0’。最近有没有什么对这种情况有帮助的东西?

EN

Stack Overflow用户

发布于 2015-12-16 15:23:58

类似于cryss写的,我为EF做了以下事情。注意,我们必须使用EntityFunctions才能调用EF支持的所有DB提供程序。SqlFunctions仅适用于SQLServer。

代码语言:javascript
复制
var sqlMinDate = (DateTime) SqlDateTime.MinValue; 

(from x in ExpenseItemsViewableDirect
let month = EntityFunctions.AddMonths(sqlMinDate, EntityFunctions.DiffMonths(sqlMinDate, x.Er_Approved_Date))
group d by month 
into g
select new
{
Period = g.Key,
   Total = g.Sum(x => x.Item_Amount),
   AveragePerTrans = Math.Round(g.Average(x => x.Item_Amount),2)
}).Dump();

体验一下生成的SQL (来自类似的模式):

代码语言:javascript
复制
-- Region Parameters
DECLARE @p__linq__0 DateTime2 = '1753-01-01 00:00:00.0000000'
DECLARE @p__linq__1 DateTime2 = '1753-01-01 00:00:00.0000000'
-- EndRegion
SELECT 
1 AS [C1], 
[GroupBy1].[K1] AS [C2], 
[GroupBy1].[A1] AS [C3]
FROM ( SELECT 
    [Project1].[C1] AS [K1], 
    FROM ( SELECT 
        DATEADD (month, DATEDIFF (month, @p__linq__1, [Extent1].[CreationDate]), @p__linq__0) AS [C1]
        FROM [YourTable] AS [Extent1]
    )  AS [Project1]
    GROUP BY [Project1].[C1]
)  AS [GroupBy1]
票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9886190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档