-3

重複の可能性:
LINQ の SQL ISNULL と同等ですか?

私はこのような3つのテーブルを持っています:

コメント表:

commentId pid    sid       text      vid
1          1     null    comment 1    1
2         null    1     comment 2    1
3          2     null    comment 3    1

学生テーブル

sid     firstname   lastname
1         john       adam
2         joan       adam

教授テーブル :

pid    firstname   lastname
1       mark        abram
2       sean        hoak

結果が次のように返されるようにクエリを作成したい:

firstname    lastname
mark          abram
john          adam
sean          hoak

メートル

if (select query ==null) then (selec query 1) else select (query 2)

私は次のことを試しました:

if((select pid from comment==null)
then select student.firstname , student.lastname from student where sid in (select sid from comment where vid=1)

else
(select professor.firstname ,professor.lastname from professor where pid in (select pid from comment where vid=1)

しかし無駄に

その後、他の人がこのソリューションクエリを提供しました

IsNull クエリ

SELECT ISNULL(P.firstname, s.firstname) AS Expr1,ISNULL(P.lastname, s.lastname) AS Expr2
FROM comment AS C 
    LEFT OUTER JOIN professor AS P ON P.ID = C.PID 
    LEFT OUTER JOIN student AS s ON s.ID = C.SID
WHERE (C.VID = 2)

合体:

  SELECT COALESCE(p.firstname, s.firstname), COALESCE(p.lastname, s.lastname)
  FROM comment c
  LEFT JOIN Professor p
  ON c.pid = p.id
 LEFT JOIN Student s
  ON c.sid = s.id
   WHERE c.vid = 2

どちらも SQL Management で正常に動作しますが、Linq では次のように動作します。

ObjectQuery<string> results1 = context.CreateQuery<string>(query1, parameters) 

私はそれを自分自身に変換しようとしました:

var qry = from c in ctx.comment
  join p in ctx.professor
  on c.PID equals p.ID into tree
  join s in ctx.student
  on c.SID equals s.ID into tree1
  where c.VID == vID
  from tmp in tree.DefaultIfEmpty()
  from tmp1 in tree.DefaultIfEmpty()
  select new
  {
      Firstnmae = tmp.firstname ?? tmp1.firstname,
      LastName = tmp.lastname ?? tmp1.lastname
  };

しかし、それはnullを返します

アイデアはありますか?

4

1 に答える 1

4

の近くtmp1にタイプミスがあるようです。tree1.DefaultIfEmpty()

      var qry = from c in ctx.comment
      join p in ctx.professor
      on c.PID equals p.ID into tree
      join s in ctx.student
      on c.SID equals s.ID into tree1
      where c.VID == vID
      from tmp in tree.DefaultIfEmpty()
      from tmp1 in tree1.DefaultIfEmpty()
      select new
      {
          Firstnmae = tmp.firstname ?? tmp1.firstname,
          LastName = tmp.lastname ?? tmp1.lastname
      };
于 2012-06-16T14:25:33.000 に答える