2012-01-26 41 views
1

我有一個費用列表(如果相關,則爲linq到sql實體) - 上限費用,下限費用(都是十進制值)。我傳遞一個property value - 說90000,我想從費用清單檢查這個property最好比賽一個(或第一值超出了許多)。Linq - 獲取一個介於下限和上限之間的值

的費用可能是這樣的......

(低費用 - 上費)

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

在這些值,90000是最適合像75001匹配 - 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(); 



    } 

Question-我將如何執行範圍檢查?我需要什麼linq運算符?不確定我是否應該花點時間,從這個範圍內獲得最好的費用?

注:收費可以很容易地是...

(低費用 - 上費)

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

如果找到最佳匹配,拉動了這一點OR得到最接近的匹配......也許我可以展示可用匹配的列表,如果其中一個不足夠接近完全匹配

回答

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

由於延遲執行LINQ查詢,因此「採取(1)」部分是多餘的。 – Nuffin

+0

需要看看,就像前一段時間使用First/FirstOrDefault時我得到'序列包含超過1個元素的異常',所以它有一點習慣使用Take(1) – hyp

+0

當使用'具有多個元素的'IEnumerable '上的Single或'SingleOrDefault'; afaik的'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