2013-03-02 6 views
1

Я хочу сделать LINQ NOT EXISTS по запросу MULTIPLE TABLES.Linq NOT EXISTS несколько таблиц

Все примеры из Google или SO обрабатывают две таблицы Я работаю с тремя, поэтому я боюсь как новичок в LINQ, как правильно их ссылаться.

Сначала я попробовал этот LINQ запрос

var nocertificates = (
    from x in rmdb.t_certificates 
    from ce in rmdb.t_user_certificates 
    from u in rmdb.t_users 
    where u.id == ce.uid && ce.value != x.id 
    select x).AsEnumerable().Select(x => new ViewModelCheckBox() 
     { 
     Value = x.id.ToString(), 
     Name = x.name, 
     Checked = false 
     }); 

Я использовал уродливые три раза по сравнению с, как я не так хорошо с созданием типов для присоединения. Но это дало неправильный результат, и я понял, что я должен был пойти для НЕ СУЩЕСТВУЕТ

Я построил новый запрос в T-SQL

Это является SQL-запрос, это работает!

select distinct * from t_certificates tc 
where NOT EXISTS 
(
select distinct * from t_users tu, t_user_certificates tuc 
WHERE tu.email = '[email protected]' 
and tu.id = tuc.[uid] 
and tuc.value = tc.id 
) 

Как бы это сделать в LINQ?

Это вопрос, я буду награждать свой ответ за это!

BUT!

Когда мы находимся в этом ... Мне действительно интересно ответить. Возможно ли сделать один запрос LINQ, который возвращает Ienumerable с теми, которые EXISTS и NOT EXISTS приводят к объекту, который будет удерживать РАЗЛИЧНЫЕ ЗНАЧЕНИЯ на проверяемое имуществе
СУЩЕСТВУЕТ -> пРОВЕРЕНО = истина
НЕ СУЩЕСТВУЕТ -> пРОВЕРЕНО = ложь

Это, как я создаю свой объект.

.Select(x => new ViewModelCheckBox() 
     { 
     Value = x.id.ToString(), 
     Name = x.name, 
     Checked = this should be different based on exists or not 
     }); 
+2

Для вашего второго вопроса: Conceptuallly это только левая внешнее соединение с ИНЕК, который выбирает только записи с Ненулевыми полями из таблицы правой быть NULL. –

ответ

2

Ответ LINQ должен выглядеть примерно так (непроверенные):

var nocertificates = 
    from x in rmdb.t_certificates 
    join tuc in (
    from u in rmdb.t_users 
    join ce in rmdb.t_user_certificates on u.id == ce.uid 
    select ce.value 
) on tuc.value = tc.id into tuc 
    from y in tuc.DefaultIfEmpty() 
    where y == null 
    select x; 
+0

Хммм что-то неправильно, таблицы несовместимы ... Я использовал другие имена для linq и SQL :(Я получаю область неправильно. – 8bitcat

2

Это то, что я в конечном итоге с помощью!

var query = (from tc in rmdb.t_certificates 
      where !(
        from tu in rmdb.t_users 
        from tuc in rmdb.t_user_certificates 
        where tu.email == username 
        && tu.id == tuc.uid 
        && tuc.value == tc.id select tc).AsEnumerable().Any() 
        select new ViewModelCheckBox() 
           { Checked = false, 
            intconverter = tc.id, 
            Name = tc.name 
           }); 
Смежные вопросы