[英]Can this SQL be done in LINQ?
我有一個簡單的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
不需要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。
您可以下拉所有數據,然后在記錄集上使用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它應該工作得很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.