我有一个简单的SQL查询,但我很难在LINQ中复制
select top 1 * from tbl_CarTax tax
ORDER BY ABS(tax.C02_From - 286.0)
我在下面尝试了这个但是我得到了错误... - LINQ to Entities无法识别方法'Int32 ToInt32(System.Object)'方法,并且此方法无法转换为商店表达式。
TaxCost = (from tax in db.DB2011_Vehicle_CarTax
orderby Math.Abs(Convert.ToInt32(C02Level - tax.C02_From))
select tax).SingleOrDefault();
任何帮助都是最贴切的
Truegilly
答案 0 :(得分:5)
不需要Convert.ToInt
。此外,FirstOrDefault
相当于top 1
。如果您的查询导致返回多行,SingleOrDefault
将抛出异常
尝试使用此代码:
TaxCost = (from tax in db.DB2011_Vehicle_CarTax
orderby Math.Abs(C02Level - tax.C02_From)
select tax).FirstOrDefault();
与其他答案相反,我认为没有必要避免使用Math.Abs
,因为实体框架知道这个方法并可以将其转换为SQL。
答案 1 :(得分:0)
你可以下拉所有数据,然后在记录集上使用Math.Abs(如果有很多信息要下拉,可能会很慢),或者你可以这样做:
(from tax in db.DB2011_Vehicle_CarTax
let level = C02Level - tax.C02_From
let abs = (level < 0) ? (level * -1) : level
orderby abs
select tax).SingleOrDefault();
可能有更合法的方法可以做到这一点,但如果这个方法足够快就应该有效。
编辑 - 实际上,似乎Math.Abs可以很好地转换为SQL。如果删除Convert.Int32,它应该可以正常工作。