5


1

LINQ to EFを使用しており、次のLINQクエリがあります。

var results =(ctxのxからxのxまでのグループx.Yearから10進数の順で、decades.Count()で降順の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 =(ctx.Itemsグループxのxから(x => x.Year.Value.ToString()。Substring(0、3) "0s")までの桁数をorderby decades.Count()から降順の選択new {10年} = decades.Key、DecadeCount = decades.Count()});

あるいはもっと一般的な構文なので、グループをonにするためにもっと複雑な評価/計算をすることができます。 何か案は?

編集(更新):

(x ⇒ x.Year.Value.ToString()。Substring(0、3) "0s") - 機能しない - "エンティティへのLINQがメソッド 'System.String ToString()'を認識しないこのメソッドはストア式に変換できません。」

(x.Year / 10 * 10) - 機能的に動作します(ありがとう) - 唯一の "問題"は 's’が最後ではないことです。 1970年対 1970年代)

by句に関数を入れる方法はありますか? すなわち this.ManipulateYear(x.Year)によるxのグループ化 または…​ x ⇒ x.Year.Value.ToString()。サブストリング(0,3) "0s" 私が考えることができるすべてのケースをカバーすることができるように(関数の呼び出しやラムダ式の使用のような)何らかのテクニックを持つことは素晴らしいことです。

これについてのみんなの助けをもう一度ありがとう。

4 Answer


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 }


6


x.Year / 10でグループ化するのはどうですか? (これはテストしていません!)

var results =(ctx.Itemsグループxのxから(x.Year / 10 * 10)までの桁数をdecades.Count()の降順のselect new {Decade = decades.Key、DecadeCount = decades.Count()})に変換します。

EDIT1:(x.Year / 10)を(x.Year / 10 * 10)に変更し、例えば198ではなく1980にしました。

EDIT2:あなたの例では、「xをx.Year.Value.ToString()でサブストリングする(0、3)、「0」、「数十年まで」)も機能するはずです。 ランバ構文は必要ありません。

編集3:余分な* 10を削除。 ありがとうマーク!


2


エンティティフレームワークの部分クラスで定義されている計算フィールドでは、グループ化や選択などの操作はできません。

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


0


私はあなたがあなたの結果の最後までSelectManyメソッドを連鎖させると信じています。 これはIEnumerableのうちのIEnumerableを返します。