C# LINQ到实体-四舍五入到最接近的美元、最接近的半美元或根本不

C# LINQ到实体-四舍五入到最接近的美元、最接近的半美元或根本不,c#,linq,entity-framework,linq-to-entities,C#,Linq,Entity Framework,Linq To Entities,我需要根据标识符通过以下方式对最终定价进行四舍五入: 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 = h

我需要根据标识符通过以下方式对最终定价进行四舍五入:

  • 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;
    }
public IQueryable GetPrices()
{
int roundingId=0;//0=不舍入。1=美元舍入。2=半美元舍入。
var价格=来自ObjectContext.Products中的ps
选择新的MyObj
{
最终价格=(ps.IsCustomPrice?ps.CustomPrice:ps.Retail),
}
退货价格;
}


我希望我可以使用一个自定义函数在LINQ中进行舍入到实体…

如果您愿意,您可以在线完成所有操作,但老实说,这似乎很难理解。试试这个:

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;
    }
}

这对你有用。您可以清理它以供自己使用,但基本上您只需使用
%
模运算符来获取美分和
?:三元运算符以选择正确的值

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)
             };
var prices=来自ObjectContext.Products中的ps
让美分=ps.价格%1
让美元=美分>0?(ps.价格+1美分):ps.价格
让半美元=美分=0?附言价格:(美分<0.5?(附言价格+0.5-美分):(附言价格+1-美分)
选择新的
{
最终价格=roundingId==0?ps。价格:(roundingId==1?高达1美元:高达半美元)
};

您的问题是什么?如果你想让它看起来流畅,你可以创建一个扩展方法来对小数进行四舍五入(或者它们是浮点数?其他类型?),就像你在这里对它们进行四舍五入一样。但是,是的,Math.Round()并不能为您做到这一点,我不相信您可以在LINQ查询中创建扩展方法。CustomPrice和Retail属性是小数。是的,我希望.Round()能为我提供更多的选项。在Linq查询中,你可以做任何你想做的事情;如果您正在谈论Linq对实体/Linq对SQL,那么是的,您在查询内部可以做的事情会受到更多的限制。如果将该匿名类型具体化为定义的类型,则可以在检索数据后流畅地执行舍入。“如果将该匿名类型具体化为定义的类型,则可以在检索数据后流畅地执行舍入”-我该怎么做?我可以为它创建一个定义的类型。收到数据后,我将如何执行舍入?我想把它包含在这个函数中,因为很多不同的区域和网站都在使用它。不幸的是,你不能从LINQ中调用方法。我尝试了您的示例并收到:LINQ to Entities不识别方法'System.Decimal GetPrice(System.Decimal,Int32)'方法,并且此方法无法转换为存储表达式。啊,您可以从LINQ内调用方法,但不能从LINQ to Entities或LINQ to SQL等调用方法。在这种情况下,我建议您在查询返回后执行该操作。我看不到另外一个选择,如果不像你上面所做的那样简单地嵌套内联bools。嵌套内联bools对我来说是可行的(我不介意它是否有点混乱),但将其与舍入到半美元相结合会给我带来很多麻烦……是的,我明白你的担忧。在返回数据后,对简单地进行转换有什么反感?除非有数以百万计的参赛作品,否则我看不到太多的性能损失。太好了!非常感谢。很好,这是一个优雅的解决方案。