1

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

我使用了丑陋的 3 次,因为我不太擅长创建连接类型。但这给出了错误的结果,我意识到我必须选择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 中做到这一点?

这就是问题,我将为此奖励我的答案!

但!

当我们这样做时...我真的很好奇答案..是否可以执行一个 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
      });
4

2 回答 2

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;
于 2013-03-02T21:58:41.830 回答
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
                                });
于 2013-03-03T00:19:25.963 回答