2017-09-04 73 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

非常感謝。我試圖做類似於上述,但我認爲我沒有秩序。 –

相關問題