2012-01-26 9 views
1

私は、フィックスのリストを持っています(関連する場合はlinqからSQLエンティティ - 関連する場合) - 上段手数料、下限手数料(どちらも小数点以下の桁数)。私はproperty valueを渡しています - 90000を言うと、私はこのproperty最高マッチ(または多数のうち最初値)場合は手数料のリストから確認したいです。Linq - 下限と上限との間の値を取得する

手数料が何かのような...

(下の料金 - 上位料)することができ - 90000帯最高75001のようなもののために、これらの値のうち

0 - 50000 
50001 - 75000 
75001 - 90000 
90001 - 140000 
190000 - 500000 

、90000一致しています、だから私はそれを引き出したいFeeDetailエンティティ。私は実際にどの演算子を使用するかわかりません、どんな助けもありがとう、私のコードはこれまでです...

[Test] 
    public void GetFeeRange() 
    { 
     const int id = 44; 
     var propValue = 90000; 

     //get a specific fee entity, then get the range of fee details... 
     var recommendedFees = RepoSession.All<Fee>() 
      .Where(x => 
        x.ClientSurveyTypeID == id) 
      .GroupJoin(_readOnlySession.All<FeeDetail>(), 
         x => x.FeeID, 
         y => y.FeeID, 
         (x, y) => new 
            { 
             FeeDetail = y.DefaultIfEmpty() 
            }) 
      .Select(x => x.FeeDetail) 
      .SingleOrDefault(); 

     Assert.IsNotNull(recommendedFees); 

     //order fees by lowest fee - *the bit I am stuck on* 
     var bestMatch = recommendedFees.OrderBy(x => x.Lower) 
      .TakeWhile(x => propValue >= x.Lower || propValue <= x.Upper) 
      .FirstOrDefault(); 



    } 

質問 - どのようにレンジチェックを実行しますか? linqのどの演算子が必要ですか?私はtakewhileを実行する必要があるかどうか分からない、その範囲から最高の手数料を得る?

注:料金は非常に簡単に...

(下の料金 - 上位料)可能性があり、最良の一致が見つかった場合、

0 - 50000 
50001 - 75000 
95001 - 140000 
190000 - 500000 

ていることに引っ張ったり取得最も近い一致...おそらく、一致するものが近くにない場合、利用可能な一致のリストを表示することができます

答えて

5

単なる単純な.Whereは、細かいはずです:

var bestMatch = recommendedFees 
       .Where(x => propValue >= x.Lower && propValue <= x.Upper) 
       .OrderBy(x => x.Lower)     
       .FirstOrDefault(); 
+0

+1しかし、OR演算子はANDで置き換える必要があります。 '.Where(x => propValue> = x.Lower && propValue <= x.Upper)' –

+0

@PaulSasikええと、投稿して変更した後にそれを見つけました。ありがとう。 –

1

どのようなもののような程度...

recommendedFees.Where(x => x.upperFee >= theFee).OrderByDescending(x => x.upperFee).Take(1).FirstOrDefault(); 
+0

'Take(1)'部分は、LINQクエリの遅延実行のために冗長です。 – Nuffin

+0

First/FirstOrDefaultを使うときにしばらく前にそれを見る必要があります。 'シーケンスに1つ以上の要素が含まれている'という例外が出ていましたのでTake(1)を使う習慣が少しあります – hyp

+0

'複数の要素を持つ 'IEnumerable 'に「Single」または「SingleOrDefault」があります。 'FirstOrDefault'メソッドは、' source'が 'null'だったとき以外は何も投げませんでした。 – Nuffin

1
var myfee = 90000; 
var myFoundFeeRange = (from feeRange in feeRanges 
      where feeRange.lowerfee <= myfee && myfee <= feeRange.upperfee 
      select feeRange).First() 

これは料金が境界内にあることを簡単なチェックを行います。一致する境界を返す

+0

'<'の代わりに '<='をチェックする必要があります。そうしないと、OPの例は何も一致しません。 – Nuffin

+0

@Tobiasあなたの権利。かわった。ありがとう:) – Doomsknight

関連する問題