2014-09-22 77 views
0

我試圖查詢一個表,我剛剛放入我們的數據庫以用作MVC 4應用程序的自定義角色提供程序時,出現了一個非常奇怪的問題。Linq to SQL忽略第一個數據庫記錄

我有三個表,用戶,角色和UserRoles。目前用於測試目的我只是在數據庫中的一個角色,與ID = 1

在表的UserRole我有兩個記錄,

  1. userRoleID 1,用戶ID = 1,角色ID = 1 。
  2. userRoleID 2,用戶ID = 14,角色ID = 1

現在試圖運行下面的LINQ時(硬編碼用於測試和舉例的目的),它永遠不會返回第一條記錄在數據庫中(userRoleID = 1)

var userRoles = from ur in _db.UserRoles 
        join r in _db.Roles on ur.roleID equals r.roleID into rj 
          from subR in rj.DefaultIfEmpty() 
        join u in _db.Users on ur.userID equals u.userID into uj 
          from subU in uj.DefaultIfEmpty() 

        where ur.userID == 1 
        select ur; 

所以在這個例子中代碼返回null。如果我更改where子句以說明ur.userID = 14,那麼它將按預期返回第二條記錄。

如果我然後切換圍繞所述數據庫記錄,使得它們成爲

  1. userRoleID 1,用戶ID = 14,角色ID = 1。
  2. userRoleID 2,用戶ID = 1時,角色ID = 1。

它現在只會返回用戶ID爲1的記錄。有沒有人遇到過這個問題,因爲我不知如何繼續。

謝謝。

+1

如果你省略連接,只需在_db.UserRoles中執行'from ur.userID == 1 select ur;'這樣工作嗎?如果您使用連接執行查詢,但沒有'where'子句,請執行所有結果? – Marco 2014-09-22 08:02:04

+0

這就是它變得更奇怪的地方。按預期刪除連接和where子句將返回兩個記錄。但是,對於userID = 1的記錄,我將包含擴展的角色和用戶表,這是我最終想要的。但對於userID = 14,我只能獲取擴展的用戶表,儘管該用戶具有與第一個用戶相同的角色值。 – user1688154 2014-09-22 08:18:45

回答

0

你可以向我解釋第一條記錄是什麼,以及如果一個表和一個查詢結果,按照SQL標準中的定義,「沒有訂單?

如果您想要訂購,請按訂購。否則,SQL Server將以任何順序返回結果。這是基礎 - SQL是基於集合的,SETS沒有固有的順序。

+0

我可以通過轉到數據庫並手動在表格的userID字段中切換數據來告訴第一條記錄。記錄1是第一個輸入到數據庫中的記錄。 – user1688154 2014-09-22 08:16:20

+0

不,你不能。 YOu可以告訴當時返回的第一條記錄,但這不是「定義中的第一條記錄」。你基本上說「我擲骰子,並要求第一個數字始終存在」。如果你想要一個定義的順序,把它放到你的sql語句中。這是初學者的知識 - 第一頁,第一本書。除非施加一個SQL,否則SQL沒有順序。 – TomTom 2014-09-22 08:18:25