LINQ Join:对象引用未设置为对象的实例

时间:2016-08-02 08:45:57

标签: c# linq linq-to-sql

我有一个从Linq到SQL生成的列表。为简单起见,它看起来像这样:

var myItems = (from my in db.MyTable
                select new
                {
                    UniqueID = my.ID,
                    UserName = my.UserName,
                    CreatedOn = my.CreatedOn
                }).ToList();

此列表包含4个项目。

我还有另一个:

var grid = (from q in AnotherLinqQuery
                select new
                {
                    UniqueID = q.ID,
                    Department = q.Department,
                    Comments = q.Comments
                }).ToList();

此列表包含20个项目。 myItems中的所有ID都显示在网格中。

现在我想通过左连接加入它。

var q = from A in grid
        from B in myItems.Where(x => x.UniqueID == grid.UniqueID).DefaultIfEmpty()
        select new 
        {
           UniqueID = A.UniqueID,
           Department = A.Department,
           CreatedOn = B.CreatedOn
        }

当我执行此操作时,我得到了

  

对象引用未设置为对象的实例。

我还尝试了其他联接,例如

from A in grid
            from B in myItems.Where(x => x.UniqueID != null && x.UniqueID == grid.UniqueID).DefaultIfEmpty()

2 个答案:

答案 0 :(得分:2)

您没有正确加入。试试这个:

var q = from A in grid
        join B in myItems on A.UniqueId equals B.UniqueId into LB
        from B in LB.DefaultIfEmpty()
        select new 
        {
            UniqueID = A.UniqueID,
            Department = A.Department,
            CreatedOn = B.CreatedOn
        };

您可能需要参考documentation以获取有关加入linq的详细信息。

答案 1 :(得分:1)

由于您正在进行左连接而不是内连接,因此myItems中没有来自grid的16个元素的项目{1}}但不在myItems

在这种情况下,

B将为null(因为DefaultIfEmpty()会创建一个包含一个null元素的序列),因此您必须在此处检查null

var q = from A in grid
        from B in myItems.Where(x => x.UniqueID == grid.UniqueID).DefaultIfEmpty()
        select new 
        {
           UniqueID = A.UniqueID,
           Department = A.Department,
           CreatedOn = B?.CreatedOn ?? DateTime.MinValue // or whatever default value you like
        }