簡體   English   中英

這個SQL可以在LINQ中完成嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM