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

时间:2011-07-20 22:01:37

标签: c# .net sql linq

我有以下查询,我将其转换为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结果进行比较,因为上面的查询针对Raw数据运行,而LINQ在数据计算和其他清理过程之后运行。所以我无法将查询结果与LINQ结果进行比较。我只需要依赖逻辑是正确的。 SQL逻辑和LINQ逻辑也是如此。

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

2 个答案:

答案 0 :(得分:2)

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

  • 使用SQL事件探查器
  • 将查询粘贴到LinqPad并查看SQL选项卡
  • 在datacontext上设置Log属性

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


顺便说一句,在你的情况下,我唯一要改变的是与样式相关的东西 - 我会将所有where子句移到select子句的上方,这样就可以更容易地看到你正在应用的过滤器。这一行

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

似乎也可能

PrevAcqPub = null

由于您已经过滤掉所有空的x并且x.ACQPub!= null(与SQL查询相同)。

答案 1 :(得分:1)

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