我有一个从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()
答案 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
}