2010-12-21 52 views
3

我试图将SQL查询转换为LINQ到实体查询,但我遇到了LINQ 选择块的问题。LINQ to Entities - Multiple Joins - Null Reference Exception on'Select'

这里是SQL查询按预期执行:

SELECT distinct(p.PendingID, 
     p.Description, 
     p.Date, 
     f.Status, 
     u.UserName, 
     m.MapID 
    FROM Pending p 
    JOIN Users u 
    ON p.UserID = u.UserID 
    LEFT JOIN Forks f 
    ON p.PendingID = f.PendingID 
    LEFT JOIN Maps m 
     ON f.ForkID = m.ForkID 
    ORDER BY p.Date DESC 

这里是LINQ到实体查询,因为我有它迄今:在任的

var pList = (from pending in pendingItems 
// JOIN 
from user in userList.Where(u => pending.UserID == u.UserID) 
// LEFT OUTER JOIN 
from fork in forkList.Where(f => pending.ID == f.PendingID) 
.DefaultIfEmpty() 
// LEFT OUTER JOIN 
from map in mapList.Where(m => fork.ID == m.ForkID) 
.DefaultIfEmpty() 
orderby pending.Date descending 
select new 
{ 
ItemID = pending.ID,     // Guid 
Description = pending.Description, // String 
Date = pending.Date,     // DateTime 
Status = fork.Status,    // Int32 (*ERROR HERE*) 
UserName = user.UserName,   // String 
MapID = map.ID      // Guid (*ERROR HERE*) 
}) 
.Distinct() 
.ToList(); 

的LINQ查询失败以下两行,它们试图分配从左外部连接检索结果中检索的值。如果以下的行被省略,LINQ查询完成,没有错误:

Status = fork.Status, 
MapID = map.ID 

为什么这些2属性分配的LINQ查询的选择块中的失败?

+0

你实际上是否对EF或内存中的数据库传真运行?其次,这是在LINQPad中的代码,你可以检查生成的SQL(如果对EF)? – 2010-12-21 18:30:27

+0

我认为这是一个编译器错误,这就是为什么他可以在两条线上看到错误。 – tster 2010-12-21 18:32:41

回答

1

问题是由于您的外部连接,forkmap可能为空。当然,当它们为空时,你不能访问它们的属性。你可能需要这样的东西:

Status = (fork == null) ? null : fork.Status, 
MapID = (map == null) ? null : map.ID