0

SQLクエリは次のとおりです。

Select distinct A.CategoryName, A.CategoryID, B.ProjectID 
from [EvalTool].[dbo].[Category] A
Left Join [EvalTool].[dbo].[CategoryAndProject2] B
On A.CategoryID = B.CategoryID AND B.ProjectID = 65

そしてうまくいけば等しいlinqステートメント:

int pID = (int)Session["projectSession"];
             ViewData.Model = (from c in _db.Category
                                join r in _db.CategoryAndProject2
                                on c.CategoryID equals r.CategoryID into join1
                                from j in join1.DefaultIfEmpty()
                                where j.ProjectID == pID
                                select new CategoryDTO
                                {
                                    CatID = c.CategoryID, 
                                    CatName = c.CategoryName,
                                    ProjID = (int) j.ProjectID
                                }).Distinct().ToList(); 

SQL ステートメントの結果は次の表になります。

CategoryName    ID  ProjectID
- - - - - - - - - - - - - - - - - - 
x   1   NULL
y   2   NULL
z   3   NULL
m   4   NULL
n   5   NULL
i   6   NULL
o   7   NULL
r   8   NULL
s   9   65
u   10  65

一方、linq ステートメントは、null エントリのない 2 つの行のみをリストします。

CategoryName    ID  ProjectID
- - - - - - - - - - - - - - - - - - 
s   9   65
u   10  65

しかし、ビューに null エントリを持つ行が必要です。

それらも確実に選択するにはどうすればよいですか?

どうもありがとう マーク

4

1 に答える 1

0

違反ライン、

where j.ProjectID == pID

は でフィルタリングされており、それ自体が null でProjectIDない限り、論理的に null 行を返しません。pIDあなたの場合はそうであるように見える65ので、行を次のように変更する必要があります

where j.ProjectID == pID || j.ProjectID == null

または、結合の一部に入れたい場合はON、次のことができます。

from c in _db.Category
join r in _db.CategoryAndProject2
   on new {c.CategoryID, ProjectID = pID} equals new {r.CategoryID, r.ProjectID} 
   into join1

これに続いて、割り当て

ProjID = (int) j.ProjectID

あなたのselectステートメントでは失敗します。あなたはそれをどうするかを決める必要があります。

于 2013-03-21T10:42:38.507 に答える