[英]LINQ to SQL query succeeds or fails based on using foreign key versus using a built in navigation property
我有一個針對SQL Server數據庫的查詢,該查詢引發Error converting data type nvarchar to numeric.
例外。 我試圖在varchar字段上使用Convert.ToDecimal
,但是我將盡我所能地盯着數據,並且也找不到無效的值。
該查詢正在使用p.pgKey=#
的外鍵按“組”過濾表。 但是,如果我使用導航屬性並改為按導航屬性過濾,則p.Group.gName='ABC'
可以運行查詢。
這是查詢(請注意,最初,我不知道在Where
翻譯或Select
處理中是否發生錯誤,因此這就是查詢看起來很奇怪的原因,但是您可以猜測,當它起作用時,它應該只返回一個true
不同行):
Profiles
.Where(p =>
p.pgKey == 237
&& !p.pPlanProfile.Value
&& Convert.ToDecimal(p.pSearch08 ?? "0") > 0
).Select(p =>
Convert.ToDecimal(p.pSearch08 ?? "0") > 0
)
.Distinct()
.Dump();
以上查詢失敗,而該查詢成功:
Profiles
.Where(p =>
p.Groups.gName == "ABC"
&& !p.pPlanProfile.Value
&& Convert.ToDecimal(p.pSearch08 ?? "0") > 0
).Select(p =>
Convert.ToDecimal(p.pSearch08 ?? "0") > 0
)
.Distinct()
.Dump();
下面是完整的LINQPad屏幕轉儲,顯示:
gKey
為237。 pgKey
或Group.gName
時, pgKey
統計Profile記錄的計數是相同的。 Group.gName
處理時查詢正常工作。 pgKey
處理時顯示查詢失敗。 顯然,我已經使用Group.gName
方法解決了我的問題,但是偶然發現了該解決方案。 有人知道為什么LINQ to SQL會這樣嗎?
注意 :使用LINQPad生成的DataContext或針對編譯的.dbml DataContext運行時,我會得到相同的行為。
這兩個查詢將生成不同的TSQL,因此查詢計划將不同。
我懷疑前一個查詢試圖將pSearch08的某些值轉換為十進制, 然后才根據其他選擇條件拒絕它們,而后一個查詢首先執行其他選擇條件,因此嘗試轉換較少的pSearch08值轉換為十進制,因此不會嘗試轉換無效值。
如果是這種情況,那么假設第二個查詢將始終有效,則最好進行修復,以修復無效數據。
不必盯着數據,您可以嘗試
SELECT * from Profile where ISNUMERIC(pSearch08) = 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.