2008-11-12 4 views
2

DDL для таблиц базы данных:Linq для SQL внешних ключей

Users: 
    id - int - identity 
    name - varchar - unique 

    PCs: 
    id - int - idnetity 
    name - varchar - unique 
    userid - FK to Users 

    Apps: 
    id - int - identity 
    name - varchar 
    pcid - FK to PCs 

Я создал DataContext с помощью Linq To SQL дизайнер в Visual Studio 2008.

Я хочу, чтобы выполнить этот запрос:

select 
    users.name, 
    pcs.name, 
    apps.name 
from 
    users u 
    join pcs p on p.userid = u.id 
    join apps a on a.pcid = p.id 

Мне сказали в другом потоке, где я отправил ответ, что следующее было неверно и что оно создало перекрестное соединение.

var query = from u in db.Users // gets all users 
     from p in u.PCs // gets all pcs for user 
     from a in p.Apps // gets all apps for pc 
     select new 
     { 
      username = u.Name, 
      pcname = p.Name, 
      appname = a.Name 
     }; 

Когда я выполняю этот запрос, я получаю правильные результаты. Перекрестное соединение с двумя записями в каждой таблице должно возвращать 8 записей, но мой запрос правильно возвращает две записи.

Мне повезло, или человек говорит мне, что я не в порядке смущен?

ответ

2

Это будет работать. Это нормально, потому что второй «из» запрашивает у пользователя ПК и третий «из» набор приложений из ПК. И я предполагаю, что это не будет генерировать кросс-соединение как T-Sql, потому что условия уже определены в внешних ключах и ассоциациях.

Но я предполагаю, что это должно быть синтаксически, вы хотите внутренним соединением;

var query = from u in db.Users 
      join p in db.PCs on p.UserId == u.Id 
      join a in db.Apps on a.PCId == p.Id 
      select new 
      { 
       username = u.Name, 
       pcname = p.Name, 
       appname = a.Name 
      }; 
0

Это выглядит хорошо для меня, я не знаю, почему, что бы создать перекрестное соединение

+1

Спасибо, Гленн. Уже поздно, просто хотел убедиться, что я не сумасшедший. http://stackoverflow.com/questions/282791/c-operator-in-linq-query#282875 – LeppyR64 2008-11-12 05:16:58

2

Jason - Я пропустил тот факт, что вы использовали встроенные связи Linq to SQL. Извините за недопонимание; при нормальных обстоятельствах то, что вы предложили здесь, будет работать нормально.

+0

И прежде, чем кто-то спросит ... «ненормальные обстоятельства» будут то, что ОП в другом потоке указал, что он не используйте FKs, что является еще одной проблемой. – GalacticCowboy 2008-11-12 12:14:30

Смежные вопросы