2012-02-16 33 views
2

我需要根據標識圓FinalPrice以下幾種方式:LINQ到實體 - 舍入到最近的美元,最近的半美元,或完全不

  • 0 =根本沒有;
  • 1 =最多下一元
  • 2 =最多到下一個半美元預計舍入的

實施例:

  • ID 0:133.15 => 133.15
  • ID 1:133.15 => 134.00
  • ID 2:133.15 => 133.50

public IQueryable<MyObj> GetPrices() 
    { 
     int roundingId = 0; //0 = no rounding. 1 = dollar rounding. 2 = half-dollar rounding. 

     var prices = from ps in ObjectContext.Products 
     select new MyObj 
     { 
      FinalPrice = (ps.IsCustomPrice ? ps.CustomPrice : ps.Retail), 
     } 

     return prices; 
    } 

我希望能使用自定義函數,以在LINQ to Entities中做這個取整操作...

+0

這裏有什麼你的問題?如果你想讓它看起來流利,你可以創建一個擴展方法來循環小數(或者它們是否浮動?其他類型?),你希望它們在這裏舍入的方式。但是 - Math.Round()不會爲你開箱。 – 48klocs 2012-02-16 16:56:25

+0

我不相信你可以在LINQ查詢中創建擴展方法。 CustomPrice和Retail屬性是小數。是的,我希望.Round()會爲我提供更多選擇。 – 2012-02-16 17:17:33

+0

你可以在Linq查詢中做任何你想做的事情;如果你正在將Linq轉換爲實體/ Linq到SQL,那麼是的,你在查詢內部可以執行的操作有更多的限制。如果您將匿名類型轉換爲定義的類型,則可以在檢索數據後流暢地執行舍入。 – 48klocs 2012-02-16 17:27:46

回答

2

這將爲你工作。你可以清理供自己使用,但基本上你只是使用%模運算符來獲得美分和? :三元運算符來選擇正確的值

var prices = from ps in ObjectContext.Products 
      let cents = ps.Price % 1 
      let upToDollar = cents > 0 ? (ps.Price + 1 - cents) : ps.Price 
      let upToHalfDollar = cents == 0 ? ps.Price : (cents < 0.5 ? (ps.Price + 0.5 - cents) : (ps.Price + 1 - cents)) 
      select new 
      { 
       FinalPrice = roundingId == 0 ? ps.Price : (roundingId == 1 ? upToDollar : upToHalfDollar) 
      }; 
+0

完美!非常感謝你。 – 2012-02-16 18:10:32

+0

不錯,這是一個優雅的解決方案。 – 2012-02-16 18:20:22

1

如果你願意,你可以全部內聯,但說實話,看起來好像很難閱讀。試試這個:

int roundingId = 0; //0 = no rounding. 1 = dollar rounding. 2 = half-dollar rounding. 

    var prices = from ps in ObjectContext.Products 
    select new 
    { 
     FinalPrice = GetPrice((ps.IsCustomPrice ? ps.CustomPrice : ps.Retail), roundingId), 
    } 

private double GetPrice(double price, int roundingOption) 
{ 
    switch (roundingOption) 
    { 
     case 0: 
     //Do stuff 
     break; 
     case 1: 
     //Do stuff 
     break; 
     case 2: 
     //Do stuff 
     break; 
    } 
} 
+0

不幸的是,你不能從LINQ中調用一個方法。我試過你的例子,並收到:LINQ to Entities不能識別方法'System.Decimal GetPrice(System.Decimal,Int32)'方法,並且此方法不能轉換爲存儲表達式。 – 2012-02-16 17:15:49

+1

嗯,你可以從LINQ內部調用一個方法,但不是LINQ to Entities或者LINQ to SQL等。 – 2012-02-16 17:17:36

+0

我會更新我的問題以添加該信息。 – 2012-02-16 17:18:13