Linq NOT EXISTS多个表

时间:2013-03-02 21:17:15

标签: linq

我想在查询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
      });

我使用了丑陋的三次,因为我对创建加入类型并不是那么好。 但这给出了错误的结果,我意识到我必须选择 NOT EXISTS

所以我在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 = 'user@email.com'
and tu.id = tuc.[uid]
and tuc.value = tc.id
)

我如何在LINQ中执行此操作?

这是个问题,我会为此给出答案!

BUT!

当我们在它的时候...我真的很好奇答案..是否有可能做一个LINQ查询返回一个Ienumerable与那些EXISTS和NOT EXISTS导致一个对象将持有不同的值在已检查的财产
EXISTS - > CHECKED = true
不存在 - > CHECKED = false

这就是我创建对象的方式。

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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
                                });