这个SQL可以在LINQ中完成吗?

时间:2011-04-05 16:03:56

标签: c# sql linq .net-4.0

我有一个简单的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

2 个答案:

答案 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,它应该可以正常工作。