2011-11-03 4 views
2

LINQ GroupByステートメントは、0〜50,50〜100,100〜250,250〜250の小数点以下のカテゴリに基づいて作成したいと考えています。可変範囲の使い方については、Group by variable integer range using Linqが見つかりましたが、そのクエリには上限があります。私のクエリは、250以上のすべてを1つのグループとして処理できる必要があります。私は上界としてdecimal.maxValueを使用しようとしましたが、クエリが処理できませんでした。値がNHibernateが処理できるものよりも大きいためです。理想的には、最大値を指定せずにこれを行いたいので、クエリはデータベースとは独立しています。グループLINQを使用してキャッチオール最大の可変天井値でNHibernateへ

編集:私は床の値の配列を使用し、リンクのパターンに従うことでこれを行うことができます。しかし、一種のキャッチオール・バイ・バイ・ビルドがあれば私は興味があります。

答えて

2

編集:

あなたは床関数を使用することができることを述べるためにあなたの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番目の項目は、それが属する最初のバケットになります。 25099以上であること。 10099以上であること。しかし5099より小さい。

  • 項目50は3番目のバケットに分類されます。
    250および100未満ですが、50に等しくなります。

は非常にあなたの質問に説明と一致しません:

あなたのグループの説明が少し壊れています。このアルゴリズムを動作させるには、別々にバケレートする必要があります。そこなど

0-50バケツ、51-100バケツなど、または0-49バケツ、バケツ50-990-50バケットだろう、と50-100バケットが一緒に存在していませんでした。

+0

はい。私は私がそれを考え出したことを反映するために私の質問を編集しました。だから私は "デフォルト"グループバイコマンドがないと思いますか? – Vish

+0

私は数学的な等価性を理解しています。それはLINQセマンティクスの問題でした。つまり、私は自分の仕事をこのように達成できますか、私は自分の仕事をどのように達成するのでしょうか。しかしあなたは答えました。私はあなたのことを受け入れたものとしてマークしました。ありがとう。 編集:私は実際には他の理由で最初に設定されたオブジェクト全体を引き出す必要がありました。しかし、私は実際に暗黙の上限よりもあまり明確ではないと思っています! – Vish

+0

@Vish:あなたのニーズを反映するために私の質問を編集しました。何かをクリアする必要があるかどうかを教えてください。 –

関連する問題