2012-03-09 113 views
0

我正在嘗試在lambda表達式中使用Sum方法進行比較,但我想將其用於多重比較。我該如何做到這一點?我看過「Let」和「SelectMany」,但我一直無法找到答案。c#使用總和進行多重比較的lambda表達式

下面是代碼的樣子:

return _dbContext.All<Table>() 
      .Where(table => table.CurrentLevel <= salesCriteria.MaxTableLevel) 
      .Where(table => table.Leg 
          .Where(leg=> salesCriteria.StartDate <= leg.AddDate) 
          .Where(leg=> leg.AddDate <= salesCriteria.EndDate) 
          .Sum(leg => leg.Width) <= salesCriteria.MaxGoalAmount); 

正如你所看到的,我試圖讓與有一定的標準,其寬度全部加起來要少腿一定條件的所有表超過一定的價值。我還想確保總和大於某個最小值。然而,我不能這樣做,因爲一旦我做了。總之,我失去了名單。那麼,我將如何在這裏完成?我想要的是minValue(最小值)< = .SUM()<等於MAXVALUE

+0

在應用其他標準之前,您是否希望將總和應用於符合您之前定義的標準的腿部集合,或者應用於整體腿部集合? – 2012-03-09 17:02:09

+0

'讓'沒有幫助你? – Gabe 2012-03-09 17:02:21

回答

1

這聽起來像你想要的東西,如:

return _dbContext.All<Table>() 
     .Where(table => table.CurrentLevel <= salesCriteria.MaxTableLevel) 
     .Select(table => new { 
      table, 
      legWidth = table.Leg 
          .Where(leg=> salesCriteria.StartDate <= leg.AddDate) 
          .Where(leg=> leg.AddDate <= salesCriteria.EndDate) 
          .Sum(leg => leg.Width) 
     }) 
     .Where(x => x.legWidth <= salesCriteria.MaxGoalAmount && 
        x.legWidth >= salesCriteria.MinGoalAmount) 
     .Select(x => x.table); 

所以這裏的Select是在查詢表達式中使用let的等價物。

作爲查詢表達式,這將是:

return from table in _dbContext.All<Table>() 
     where table.CurrentLevel <= salesCriteria.MaxTableLevel 
     let legWidth = table.Leg 
          .Where(leg=> salesCriteria.StartDate <= leg.AddDate) 
          .Where(leg=> leg.AddDate <= salesCriteria.EndDate) 
          .Sum(leg => leg.Width) 
     where legWidth <= salesCriteria.MaxGoalAmount && 
      legWidth >= salesCriteria.MinGoalAmount 
     select table; 
+0

freakin完美!謝謝Jon。 – Riz 2012-03-09 17:21:10

0

要獲得let的力量,你需要從方法鏈式語法切換到查詢表達式語法。試試這個:

var goodTables = 
    from table in _dbContext.All<Table>() 
    where table.CurrentLevel <= salesCriteria.MaxTableLevel 
    let sumOfWidthOfGoodLegs = 
     table.Leg 
     .Where(leg=> salesCriteria.StartDate <= leg.AddDate) 
     .Where(leg=> leg.AddDate <= salesCriteria.EndDate) 
     .Sum(leg => leg.Width)  
    where sumOfWidthOfGoodLegs <= salesCriteria.MaxGoalAmount 
    // can insert another where on sumOfWidthOfGoodLegs here as required 
    select table; 

return goodTables.ToList(); 

我注意到,這是檢查的只有好腿寬度之和 - 我不相信這是你想要的,但它是你現在在做什麼。