2011-03-22 48 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(); 

问候