2016-07-01 3 views
1
// The "myData" table contains two fields: name, value and type. 
// The "myInfo" table contains two fields: type and value. 

var myQuery = from x in myData 
    select new { 
     name = x.name, 
     value = x.value, 
     minValue = myInfo.Where(y => x.type == y.type).OrderBy(y => y.value).FirstOrDefault().value, 
     isOverMinValue = (myInfo.Where(y => x.type == y.type).OrderBy(y => y.value).FirstOrDefault().value) > x.value ? true : false 
    }; 

myInfoテーブルには、myDataのタイプに一致する複数のレコードが含まれることがあります。私は最小値しか求めません。次に、myDataの値がmyInfoの最小値よりも大きいかどうかを示すisOverMinValueフィールドが必要です。C#LINQ:クエリの他の値に基づいて匿名型プロパティを設定する効率的な方法は?

この例では動作しますが、わかりましたが、サブクエリ全体を2回繰り返す必要があります。これは効率的ではありません。私が持っていた別のアプローチは次のとおりでした:

var myQuery = from x in myData 
    select new { 
     name = x.name, 
     value = x.value, 
     minValue = myInfo.Where(y => x.type == y.type).OrderBy(y => y.value).FirstOrDefault().value, 
     isOverMinValue = false 
    }; 

foreach (var myRec in myQuery) 
{ 
    if (myRec.minValue < x.Value) myRec.isOverMinValue = true; 
} 

これは、匿名型のプロパティが読み取り専用であるために動作しません。

これを行うより効率的な方法はありますか?

(私はMyInfoのは、複数のエントリを含み、MyInfoの中で発見されたどのように多くの一致に基づいて多くのレコードを生成することになります参加し、通常のLINQやっかもしれないと言ったので同じように参加することができません。)

答えて

4

ますletキーワードを使用することができます:ところで

var myQuery = from x in myData 
    let minvalue = myInfo.Where(y => x.type == y.type) 
         .OrderBy(y => y.value).FirstOrDefault().value 
    select new { 
     name = x.name, 
     value = x.value, 
     minValue = minvalue, 
     isOverMinValue = minvalue > x.value 
    }; 

を、私はあなたが>サイン権を持っているかはわかりません。

+1

このように 'minvalue'を割り当てる方が良いでしょう:' let minvalue = myInfo.Where(y => x.type == y.type).Select(a => a.value).Min() ' ? 'OrderBy'と残りの文は冗長であると思います。 –

+0

AWESOME!正確に私が必要としたもの。私は間違っているかもしれないが、それは別の問題だ。 :-) – fdmillion

+1

@MaciejLosそれも見ていないが、はい、私はそう思います、ありがとう。 'myInfo.Where(y => x.type == y.type).Min(x => x.value)'です。 –

関連する問題