具有多个左连接和where子句的LINQ

本文关键字:where 子句 LINQ 连接 | 更新日期: 2023-09-27 18:03:02

我有以下查询,我正在将其转换为LINQ。

select acq.ACQPub as Prev_ACQPub
     , ve.CompanyID
         , ve.EntityID
         , ve.RoundID
         , ve.EntityName
         , ve.Date
         , ve.RoundTypeCode
         , ve.EventType
         , ve.PostValue_DJVS
         , ve.PostVal
         , ve.PreVal
         , fin.FinanceStat
    from ValuationEvents_PIT_New as ve
    left join Acq_PublicDummy as acq
    on ve.EntityID = acq.EntityID
    left join FinStat_New as fin
    on ve.EntityID = fin.EntityID
    where ve.EventType in('ACQ','LBO')
      and acq.ACQPub is null

我想再检查一下我是否做对了,或者是否有更好的方法。

下面是我的代码:
return (from ve in valuationEvents where ve.EventType == EventTypes.Acq || ve.EventType == EventTypes.Lbo
                          join acq in acqPublicDummies on ve.EntityId equals acq.EntityID into veAcq
                          from x in veAcq.DefaultIfEmpty() where x != null && x.ACQPub == null
                          join fin in finStats on ve.EntityId equals fin.EntityID into veFin
                          from y in veFin.DefaultIfEmpty()
                          select new AcqResearch
                                     {   PrevAcqPub = x == null ? null : x.ACQPub,                                          
                                         EntityId = ve.EntityId,
                                         CompanyId = ve.CompanyId,
                                         RoundId = ve.RoundId,
                                         Date = ve.Date,
                                         RoundTypeCode = ve.RoundTypeCode,
                                         EventType = ve.EventType.ToString(),
                                         PostValueDjvs = ve.PostMoneyValue,
                                         PostVal = ve.PostVal,
                                         PreVal = ve.PreVal,                                             
                                         FinanceStat = y == null ? null : y.FinanceStat
                                     }).ToList();

由于结果将被使用> 1次,我返回List而不是IEnumerable。

我也不能运行SQL并将其结果与LINQ结果进行比较,因为上面的查询是针对原始数据运行的,而LINQ是在数据计算和额外的清理过程之后运行的。因此,我无法将查询结果与我的LINQ结果进行比较。我只需要相信逻辑是正确的。SQL逻辑和LINQ逻辑是相同的。

非常感谢您的帮助和反馈!

具有多个左连接和where子句的LINQ

如果要验证查询是否相同,可以查看从linq生成的SQL。有几种方法可以做到这一点:

  • 使用SQL Profiler
  • 将查询粘贴到LinqPad中并查看SQL选项卡
  • 在数据上下文
  • 上设置Log属性

您可以比较两个SQL查询并检查差异。


作为题外话,在你的情况下,我唯一要改变的是与样式相关的东西——我将把所有的where子句移动到select子句的上方,这样更容易看到你应用的是什么过滤器。另外, 这一行

PrevAcqPub = x == null ? null : x.ACQPub

似乎也可以是

PrevAcqPub = null

因为你已经过滤掉了所有的x是null和x. acqpub != null(同样适用于SQL查询)。

你的解决方案对我来说是正确的