編集:
あなたは床関数を使用することができることを述べるためにあなたのOPを変更していますが、デフォルトのグループ化について調べるたかったです。
数学的にfloor関数は同等です。天井の場合、使用されるデータの下限はおそらく0です。床の場合、論理上限は正の無限大です(実際には、整数がサポートしないためDBがサポートする最高値になります)無限の概念)。それはあなたが行きたいところをあなたに与えます。
あなたが他の状況により適用されるかもしれない何かをしたい場合は、このような何かを試みることができる:私は、これは思わないとしてそれはおそらく、NHibernateのにLINQのでは動作しません
items.GroupBy(item =>
(
floors.FirstOrDefault(floor => floor <= item)
?? "Default"
)
.ToString()
);
をSQLにうまくマップする。代わりに、全体のセットを最初にメモリ(.ToList()
)にインポートし、あなたのグループをLinq to Objectsクエリとして追加することができます。
それはこのような状況でそれを使用するために多くの意味がありませんが、それは非数ライングループの場合があります
var groups = new HashSet<string>
{
"Orange",
"Green",
"Mauve",
};
items.GroupBy(item =>
groups.Contains(item.Color)
? item.Color
: "Default"
);
を編集する前に:
あなたは単にロジックを逆転させることができ、の下に自動的に特定の値のが含まれます。
var floors = new[] { 250, 100, 50, 0 };
var groupings = items.GroupBy(item => floors.First(floor => floor <= item));
仕組み:
はアイテム270
してください。
リストの最初の項目は、それが属する最初のバケットになります。これは、250 <= 270
です。
99
を取る。
リストの3番目の項目は、それが属する最初のバケットになります。 250
は99
以上であること。 100
は99
以上であること。しかし50
は99
より小さい。
項目50
は3番目のバケットに分類されます。
250
および100
未満ですが、50
に等しくなります。
は非常にあなたの質問に説明と一致しません:
あなたのグループの説明が少し壊れています。このアルゴリズムを動作させるには、別々にバケレートする必要があります。そこなど
0-50
バケツ、51-100
バケツなど、または0-49
バケツ、バケツ50-99
、0-50
バケットだろう、と50-100
バケットが一緒に存在していませんでした。
はい。私は私がそれを考え出したことを反映するために私の質問を編集しました。だから私は "デフォルト"グループバイコマンドがないと思いますか? – Vish
私は数学的な等価性を理解しています。それはLINQセマンティクスの問題でした。つまり、私は自分の仕事をこのように達成できますか、私は自分の仕事をどのように達成するのでしょうか。しかしあなたは答えました。私はあなたのことを受け入れたものとしてマークしました。ありがとう。 編集:私は実際には他の理由で最初に設定されたオブジェクト全体を引き出す必要がありました。しかし、私は実際に暗黙の上限よりもあまり明確ではないと思っています! – Vish
@Vish:あなたのニーズを反映するために私の質問を編集しました。何かをクリアする必要があるかどうかを教えてください。 –