LINQ to Entities - округление до ближайшего доллара, ближайшего полдоллара или вовсе - PullRequest
2 голосов
/ 16 февраля 2012

Мне нужно округлить FinalPrice следующими способами на основе идентификатора:

  • 0 = Совсем нет
  • 1 = до следующего доллара
  • 2 = до следующего полдоллара

Пример ожидаемого округления:

  • ID 0: 133,15 => 133,15
  • ID 1: 133.15 => 134.00
  • ID 2: 133.15 => 133.50

</p> <pre><code> 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 ...

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Это будет работать для вас. Вы можете очистить его для собственного использования, но в основном вы просто используете оператор % по модулю, чтобы получить центы, и троичный оператор ? :, чтобы выбрать правильное значение

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)
             };
1 голос
/ 16 февраля 2012

Вы можете сделать все это встроенным, если хотите, но, честно говоря, кажется, что это будет трудно читать. Попробуйте это:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...