具有多个左连接和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逻辑是相同的。
非常感谢您的帮助和反馈!
如果要验证查询是否相同,可以查看从linq生成的SQL。有几种方法可以做到这一点:
- 使用SQL Profiler
- 将查询粘贴到LinqPad中并查看SQL选项卡
- 在数据上下文 上设置Log属性
您可以比较两个SQL查询并检查差异。
作为题外话,在你的情况下,我唯一要改变的是与样式相关的东西——我将把所有的where子句移动到select子句的上方,这样更容易看到你应用的是什么过滤器。另外, 这一行
PrevAcqPub = x == null ? null : x.ACQPub
似乎也可以是
PrevAcqPub = null
因为你已经过滤掉了所有的x是null和x. acqpub != null(同样适用于SQL查询)。
你的解决方案对我来说是正确的