6

LINQ to EF を使用しており、次の 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 年) 私が本当にやりたいことは、それらを 10 年ごとに分類することです (つまり、2000 年代 - 15 年、1970 年代 - 16 年)。

Linq ステートメントのグループ句の "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().Substring(0, 3) + "0s") - 動作しません - "LINQ to Entities はメソッド 'System.String ToString()' メソッドを認識しません。このメソッドはストア式に変換できません。」

(x.Year / 10 * 10) - 機能的に動作します (ありがとうございます) - 唯一の「問題」は、「s」が末尾にないことです (つまり、1970 対 1970 年代)

とにかくby句に関数を入れることはありますか? つまり、x を this.ManipulateYear(x.Year) で数十年にグループ化 ... または ... x => x.Year.Value.ToString().Substring(0,3) + "0s" ?? 考えられるあらゆるケースをカバーできるように、なんらかのテクニック (関数の呼び出しやラムダ式の使用など) があると便利です。

これについてのみんなの助けにもう一度感謝します。

4

4 に答える 4

7

この句を使用してlet、10 年間を複数回カウントしないようにすることができます。

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 }
于 2008-12-21T23:55:35.070 に答える
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) に変更して、たとえば、198 ではなく 1980 を取得しました。

EDIT2: あなたの例では、「x.Year.Value.ToString().Substring(0, 3) + "0s") で x を数十年にグループ化する」も機能するはずです。ランバ構文は必要ありません。

EDIT3: 余分な * 10 を削除しました。ありがとう、マーク!

于 2008-12-21T02:15:41.373 に答える
2

エンティティ フレームワークの部分クラスで定義されている計算フィールドに対して、グループ化や選択などを行うことができないようです。

計算フィールドは、LINQ to オブジェクトで使用できます (したがって、すべてのデータをオブジェクトとして返し、グループ化を行うことができます)。

于 2009-10-11T23:45:16.123 に答える
0

SelectMany メソッドを結果の最後にチェーンすると思います。これは、IEnumerables の IEnumerable を返します。

于 2008-12-21T02:09:51.417 に答える