我有以下查询,我将其转换为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逻辑也是如此。
非常感谢您的帮助和反馈!
答案 0 :(得分:2)
如果要验证查询是否相同,可以查看从linq生成的SQL。有几种方法可以做到这一点:
然后,您可以比较两个SQL查询并检查差异。
顺便说一句,在你的情况下,我唯一要改变的是与样式相关的东西 - 我会将所有where子句移到select子句的上方,这样就可以更容易地看到你正在应用的过滤器。这一行
PrevAcqPub = x == null ? null : x.ACQPub
似乎也可能
PrevAcqPub = null
由于您已经过滤掉所有空的x并且x.ACQPub!= null(与SQL查询相同)。
答案 1 :(得分:1)
您的解决方案对我来说是正确的