2017-09-04 70 views
0

我能够像我希望的那样使其工作,但我更喜欢查询语法的方法语法。如何将此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 
+5

我正在投票结束这个问题作为题外话,因为用不同的语法或语言编写等效代码并非如此。我们将帮助您修复损坏的代码。但是,如果你想要代码翻译,你必须尝试别的地方。 –

+0

@SamAxe:如果OP明确指出哪一部分不清楚,它会不会成为话题? – Stefan

+0

@Stefan:我想不会。解释功能代码并不是SO *所认为的。显然有些人不同意这种评估。 –

回答

1

这次演习是针对无连接的查询很机械。

的基本规则是从from stat条款中提取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您拉姆达的参数。

请注意,这只是一种可能的命名方案。显然

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

,使用一致的命名方案,大大提高了可读性:由于在lambda表达式的参数名称是本地的拉姆达,可以在里面WhereOrderByGroupBy使用不同的变量名。

+0

非常感谢。我试图做类似于上述,但我认为我没有秩序。 –

相关问题