2011-03-22 47 views
4

也許一個相當簡單的問題,但我是Linq to SQL中的新成員。我有兩個表將Linq中的兩個表連接到SQL

User : UserId,name,Password,Email 
USER_TABLE: Id, UserId, FirstName,LastName...... 

我想一個查詢,給出例如:userID=3然後給所有的細節(FirstName,LastName etc) 我如何加入這兩個表?如果可能,我更願意使用C#代碼!

回答

6

你不必自己做所有的管道。如果您在數據庫中擁有正確的外鍵,則不必參加。

你可以這樣做:

var query = from u in db.Users 
select new { User = u; 
FirstName = u.UserTables.FirstName } 
+1

如果你走這條路線,一定要小心,你有你想要的管道 - 否則你可能會發現,對於100名用戶的列表,你最終可能會做出101個查詢 - 1個用戶列表和100個每個FirstName反過來。 – Stuart 2011-03-22 10:31:30

+0

@Stuart:你的意思是延期加載但不是,那是不正確的。如果您使用像這樣的select {},它將只執行一次連接。但是,如果您要對用戶執行foreach,然後在foreach中引用UserTable,您將得到延遲加載(1 + 100)。然而,這可以通過使用LoadOptions來控制 – Pleun 2011-03-22 11:19:18

+0

是的 - 同意 - 我小心地說「可能」,並說你可以通過「管道」避免 - 但我可以更清楚,更明確 - 對不起。 – Stuart 2011-03-22 11:21:06

2

像這樣也許:

var joinedResult = from u in context.User 
        join u2 in context.UserTable on u.UserId equals u2.UserId 
        select new { 
         UserId = u.UserId, 
         FirstName = u2.FirstName 
        }; 

我猜你的例子只是一個例子,對不對?因爲將這些數據分成兩個表格沒有多大意義。

+0

您折中一下這樣的數據評論,我完全同意 - 但我也認爲它實際上很常見 - 特別是在ASP.Net會員代碼中。 – Stuart 2011-03-22 09:21:16

+0

我們都知道*這是*軟件工程的一個很好的例子:) – 2011-03-22 09:22:33

4

用於內部連接使用類似:

var query = from u in db.Users 
      join ut in db.UserTables on u.UserId equals ut.UserId 
      select new 
      { 
       User = u, 
       Extra = ut 
      }; 
+1

我不想在USER_TABLE中使用UserId作爲外鍵。所以我必須用你提出的這種方式? – dali1985 2011-03-22 10:49:29

+0

如果你不希望它作爲FK(這是非常不尋常的!),那麼你可以在u.Userid == ut.Userid'中使用'from ut.UserTables'代替。 – Stuart 2011-03-22 10:52:12

1

有可能使用LINQ to連接表:

如:

var test = (from a in DataContext.User 
    join b in DataContext.UserTable on a.UserId equals b.UserId 
    select new 
    {      
     UserId = a.UserId, 
     FirstName = b.FirstName 
     LastName = b.LastName 
    }).ToList(); 

問候