【问题标题】:failing in result for left outer join c#左外连接c#的结果失败
【发布时间】: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: 是的,财务和事件都有价值
  • 嗯,这确实表明ynull 的最终结果。
  • @GertArnold:但财务有价值

标签: c# linq lambda


【解决方案1】:

试试这个

var var qry = from e in events
            join  f in finances on e.CustomerID equals f.CustomerID into fj
            from f in fj.DefaultIfEmpty()
             select new {
                  CustomerID=e.CustomerID,
                  Start =e.Start,
                  End = e.End,
                  FullName = e.FullName,
                  Debtor = f.Debtor,
                  Creditor = f.Creditor
                 };

【讨论】:

  • 不,它没有成功
  • @nnmmss “它没有成功” - 错误是什么?
  • 我为事件和金融定义了两个 Dto 类。因此它们具有特定的返回值而不是匿名的。并且还将“从 fj.DefaultIfEmpty() 中的 f”更改为“从 fj.DefaultIfEmpty() 中的 ef”。然后它起作用了。但我不能用 lambda
  • @nnmmss 您需要正确的代码还是需要 lambda?在任何情况下,编译器都会将 lambda 转换回您现在可以看到的代码,然后再转换为设置的 foreach 和 where 运算符
  • 我绝对需要正确的代码。但我很好奇如何在 lambda 中找到我的问题所在。但无论如何谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 2014-01-27
  • 1970-01-01
  • 2017-12-08
  • 2017-01-20
相关资源
最近更新 更多