2008-12-21 18 views
5

我使用LINQ到EF,並具有以下LINQ查詢分組:使用LINQ我怎麼有一個「計算字段」

var results = (from x in ctx.Items 
       group x by x.Year into decades 
       orderby decades.Count() descending 
       select new { Decade = decades.Key, DecadeCount = decades.Count() }); 

所以這種得到我的地方,我想,因爲我得到了按年分解的項目和當年的項目數。 (即2001 - 10,1975 - 15,2005 - 5,1976 - 1)我真正想做的事情是將它們分解十年(即2000年代 - 15年代,1970年代 - 16年代)。

如何在Linq語句的group子句的「by」部分中包含「計算字段」。我想我要的是基本一樣的東西:

var results = (from x in ctx.Items 
       group x by (x => x.Year.Value.ToString().Substring(0, 3) + "0s") into decades 
       orderby decades.Count() descending 
       select new { Decade = decades.Key, DecadeCount = decades.Count() }); 

或者更一般的語法,這樣我可以做一些更復雜的評價/計算由上做組。有任何想法嗎?

編輯(更新):

(X => x.Year.Value.ToString()子串(0,3)+ 「0」) - 不工作 - 「LINQ實體不識別方法'System.String ToString()'方法,並且此方法不能轉換爲存儲表達式。「

(x.Year/10 * 10) - 功能作品(謝謝) - 唯一的 「問題」 是, 'S' 是不是在年底(即1970年對20世紀70年代)

有無論如何要把一個函數放在by子句中? (x.Year)轉換成數十年......或... x => x.Year.Value.ToString()。子字符串(0,3)+「0s」?有一些技巧(如調用函數或使用lambda表達式)會很好,這樣我就可以覆蓋任何我能想到的情況。

再次感謝大家的幫助。

回答

2

看起來我們不能做一個分組或選擇執行,或者在definied在部分類對實體計算字段相似框架。

的計算字段可以在LINQ使用的對象(所以你可以返回所有的數據作爲對象,然後做一個分組)

0

我相信你會將SelectMany方法鏈接到結果的末尾。這將返回一個IEnumerable的IEnumerables。

+1

號,一組是已經IEnumerables的IEnumerable(如IGrouping延伸IEnumberable)。這裏不需要SelectMany。 – 2008-12-21 08:09:18

6

如何按x.Year/10分組? (沒有測試!)

var results = (from x in ctx.Items 
       group x by (x.Year/10 * 10) into decades 
       orderby decades.Count() descending 
       select new { Decade = decades.Key, DecadeCount = decades.Count() }); 

EDIT1:改變(x.Year/10)(/ x.Year 10 * 10)來獲得,而不是,例如,1980年198

編輯2:在你的例子中,「組x通過x.Year.Value.ToString()。子串(0,3)+」0s「)成幾十年」也應該起作用。不需要lamba語法。

EDIT3:刪除了額外的* 10.謝謝馬克!

+0

在LINQ到對象應該很好。使用EF,你需要仔細檢查算術如何計算(int/float/etc)。你可能想要`數學。例如,Floor(x.Year/10)* 10` - 假設EF可以將Math.Floor映射到TSQL的FLOOR。 – 2008-12-21 09:34:10

+0

哦,你可能有* 10兩次(一次在`group`,一次在`select new`) – 2008-12-21 09:34:58

7

可以使用let條款,以避免計數十年多次:

from x in ctx.Items 
group x by (x.Year/10 * 10) into decades 
let decadeCount = decades.Count() 
orderby decadeCount descending 
select new { Decade = decades.Key, DecadeCount = decadeCount } 
相關問題