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 语句仅列出 2 行,即那些没有空条目的行。

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

但我需要那些在我的视图中有一个空条目的行。

我怎样才能确保也选择那些?

非常感谢提前标记

4

1 回答 1

0

违规的线路,

where j.ProjectID == pID

正在过滤ProjectID,并且逻辑上不会返回空行,除非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 回答