簡體   English   中英

LINQ to SQL查詢基於使用外鍵還是使用內置導航屬性而成功或失敗

[英]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屏幕轉儲,顯示:

  1. 證明ABC的gKey為237。
  2. 證明使用pgKeyGroup.gName時, pgKey統計Profile記錄的計數是相同的。
  3. 顯示使用Group.gName處理時查詢正常工作。
  4. 使用pgKey處理時顯示查詢失敗。

LINQPad屏幕截圖

顯然,我已經使用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.

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