如何将此linq从查询语法转换为方法语法

时间:2017-09-04 19:20:57

标签: c# entity-framework linq

我能够像我想要的那样使用它,但我更喜欢方法语法到查询语法。

如何使用方法语法编写?

var data = (from stat in this._applicationDbContext.Stats
            where stat.SupId == this.GetCurrentSupId() && stat.StatType == 1
            orderby stat.WeekEnding descending
            group stat by stat.WeekEnding into statGroup
            select new WeeklyStat
                       {
                           WeekEnding = statGroup.First().WeekEnding,
                           Amount = statGroup.Sum(a => a.StatValue)
                       }).Take(6);

这是原始的SQL:

SELECT TOP (6)  
    SUM([stat_value]) AS lessons_graded,
    CONVERT(DATE, [weekend]) weekending 
FROM 
    [dbo].[Stats]
WHERE
    stat_type = 1 AND sup_id = 1113
GROUP BY
    CONVERT(DATE, [weekend])
ORDER BY 
    CONVERT(DATE, [weekend]) DESC

1 个答案:

答案 0 :(得分:1)

对于没有连接的查询,此练习非常机械化。

基本规则是从stat子句中提取from stat变量,并将其粘贴到每个单独的子句中,如下所示:

var data = this._applicationDbContext.Stats
    .Where(stat => stat.SupId == this.GetCurrentSupId() && stat.StatType == 1)
    .OrderByDescending(stat => stat.WeekEnding)
    .GroupBy(stat => stat.WeekEnding)
    .Select(statGroup => new WeeklyStat {
        WeekEnding = statGroup.First().WeekEnding,
        Amount = statGroup.Sum(a => a.StatValue)
    }).Take(6);

同样的事情发生在GroupBy之后 - 现在你开始使用statGroup作为你的lambda参数。

请注意,这只是一种可能的命名方案。由于lambdas中的参数名称是lambda的本地名称,因此您可以在WhereOrderByGroupBy中使用不同的变量名称:

.Where(x => x.SupId == this.GetCurrentSupId() && x.StatType == 1)
.OrderByDescending(y => y.WeekEnding)
.GroupBy(z => z.WeekEnding)

显然,使用一致的命名方案可以大大提高可读性。