2011-04-05 143 views
3

我有一個簡單的SQL查詢,但即時通訊掙扎在LINQ這個SQL可以在LINQ中完成嗎?

select top 1 * from tbl_CarTax tax 
ORDER BY ABS(tax.C02_From - 286.0) 

複製我曾嘗試以下,但我得到的錯誤... - LINQ到實體無法識別方法「的Int32 ToInt32(系統.Object)'方法,並且此方法不能轉換爲商店表達式。

TaxCost = (from tax in db.DB2011_Vehicle_CarTax 
orderby Math.Abs(Convert.ToInt32(C02Level - tax.C02_From)) 
select tax).SingleOrDefault(); 

任何幫助最appriciated

Truegilly

+1

C02Level和tax.C02_From屬性有哪些類型? – SWeko 2011-04-05 16:07:36

+0

「C02Level」和「tax.C02_Form」的數據類型是什麼?您可能會遇到數據類型轉換問題。 – 2011-04-05 16:08:58

+0

C02Level是一個double和tax.C02_From是一個int :) – JGilmartin 2011-04-05 16:11:18

回答

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

如果他真的需要放棄小數,他可以調用'Math.Floor',它也可以很好地在LINQ上轉換爲EF。 – Equiso 2011-04-05 16:28:08

+0

剛剛驗證Linq to Entities將Math.Abs​​轉換爲此Transact函數:ABS() – 2016-07-11 05:34:27

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它應該工作得很好。