【发布时间】:2021-09-27 17:49:16
【问题描述】:
我想在两个查询之间进行左外连接并将结果填充到新的对象实例中
这是第一个查询的代码,单独工作正常,获取数据
var finances = _context.Finances
.GroupBy(p => p.CustomerID)
.Select(m => new
{
CustomerID = m.Key,
Debtor = m.Sum(p => p.Debtor),
Creditor = m.Sum(p => p.Creditor),
}).ToList();
第二个查询单独工作正常,获取数据
var events = _context.Events
.Include(p=>p.Customer)
.Where(p=>p.Start.ToString().CompareTo(reqDate) >= 0)
.Select(p => new
{
CustomerID = p.CustomerID,
FullName =p.Customer.FirstName + ' ' +p.Customer.LastName,
End =p.End,
Start = p.Start,
}).ToList();
所以左外连接应该是这样的
var qry = events.GroupJoin(
finances,
ev1 => ev1.CustomerID,
fi1 => fi1.CustomerID,
(f, bs) => new { events = f, finances = bs })
.SelectMany(
eventsFinances => eventsFinances.finances.DefaultIfEmpty(),
(x, y) => new RequestEventsDto
{
CustomerID=x.events.CustomerID,
Start = x.events.Start,
End = x.events.End,
FullName = x.events.FullName,
Debtor = y.Debtor,
Creditor = y.Creditor,
});
事件表将填充数据,但财务表不会(其中实际包含数据)并给出此错误
“对象引用未设置为对象的实例。”
如果我在财务表中评论这两行,其余的都可以正常工作
Debtor = y.Debtor,
Creditor = y.Creditor,
左外连接的哪一部分有问题?
【问题讨论】:
-
finances列表是否有任何值?这是我在 SelectMany 查询中看到y为空的唯一情况。 -
不应该是
y.finaces.Debtor? -
@AndrewH: 是的,财务和事件都有价值
-
嗯,这确实表明
y是null的最终结果。 -
@GertArnold:但财务有价值