1

クエリ MULTIPLE TABLES で LINQ NOT EXISTS を実行したいと考えています。

GoogleまたはSOのすべての例は、私が3つで作業している2つのテーブルを処理しているため、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でそれを行うにはどうすればよいですか?

これが質問です、私はそれに対する私の答えを授与します!

しかし!

私たちがそこにいるとき...私は答えに本当に興味があります..EXISTSとNOT EXISTSの両方でIenumerableを返すLINQクエリを1つ実行して、チェックされた上で異なる値を保持するオブジェクトを生成することは可能ですか?プロパティが存在する
-> 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

結局使ったのはこれ!

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 に答える
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 に答える