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