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对我来说是可行的(我不介意它是否有点混乱),但将其与舍入到半美元相结合会给我带来很多麻烦……是的,我明白你的担忧。在返回数据后,对简单地进行转换有什么反感?除非有数以百万计的参赛作品,否则我看不到太多的性能损失。太好了!非常感谢。很好,这是一个优雅的解决方案。