C# 具有条件的多个联接:LINQ查询
我正在尝试将SQL查询转换为c等价的LINQ/Lambda,如下所示C# 具有条件的多个联接:LINQ查询,c#,sql,.net,linq,lambda,C#,Sql,.net,Linq,Lambda,我正在尝试将SQL查询转换为c等价的LINQ/Lambda,如下所示 SELECT mv.MeasureID, mv.ProviderID, MAX(mv.ReportingDate) AS mostRecentReportingDate FROM (((TransactionDetail AS td INNER JOIN #provider AS p ON td.TrustCode = p.Code) INNER JOIN #measure
SELECT mv.MeasureID, mv.ProviderID, MAX(mv.ReportingDate) AS mostRecentReportingDate
FROM (((TransactionDetail AS td
INNER JOIN #provider AS p ON td.TrustCode = p.Code)
INNER JOIN #measure AS m ON td.MetricCode = m.InternalID)
INNER JOIN #measureValue AS mv ON m.ID = mv.MeasureID AND p.ID = mv.ProviderID)
WHERE td.BatchID = @batchID AND
td.RowAction = 'A' AND
(m.Type = 7 OR m.Type = 8) AND
td.Value <> mv.Value
GROUP BY mv.MeasureID, mv.ProviderID
join MV in measureValue on new { mID = M.Id, pID = P.Id } equals new {mID = MV.MeasureId, pID = MV.ProviderId }
以下是我迄今为止所做的尝试
var total = (from TD in ingestionHubContext.TransactionDetail
join P in provider on TD.TrustCode equals P.Code
join M in measure on TD.MetricCode equals M.InternalId
join MV in measureValue on M.Id equals MV.MeasureId //and logic to be fixed
where TD.BatchId == batchId && TD.RowAction == "A"
&& (M.Type == 7 || M.Type == 8) && TD.Value != MV.Value
group TD by new { MV.MeasureId, MV.ProviderId } into Total
select Total);
你能建议我怎样才能写得更好吗?并处理代码第4行中的连接和条件
我试过下面的方法,但不起作用,因为它们需要在
身份证
我还需要帮助做MAXmv.ReportingDate
非常感谢您的帮助。提前感谢。当ON子句中有多个字段时,您需要使用对象进行比较。 您的LINQ查询应编写如下:
var total = (from TD in ingestionHubContext.TransactionDetail
join P in provider on TD.TrustCode equals P.Code
join M in measure on TD.MetricCode equals M.InternalId
// Here is how
join MV in measureValue on new {M.Id, P.Id} equals new {MV.MeasureId, MV.ProviderId}
// the rest is your original where statement
where TD.BatchId == batchId && TD.RowAction == "A"
&& (M.Type == 7 || M.Type == 8) && TD.Value != MV.Value
group TD by new { MV.MeasureId, MV.ProviderId } into Total
select Total);
我通过编写下面的查询来解决这个问题
SELECT mv.MeasureID, mv.ProviderID, MAX(mv.ReportingDate) AS mostRecentReportingDate
FROM (((TransactionDetail AS td
INNER JOIN #provider AS p ON td.TrustCode = p.Code)
INNER JOIN #measure AS m ON td.MetricCode = m.InternalID)
INNER JOIN #measureValue AS mv ON m.ID = mv.MeasureID AND p.ID = mv.ProviderID)
WHERE td.BatchID = @batchID AND
td.RowAction = 'A' AND
(m.Type = 7 OR m.Type = 8) AND
td.Value <> mv.Value
GROUP BY mv.MeasureID, mv.ProviderID
join MV in measureValue on new { mID = M.Id, pID = P.Id } equals new {mID = MV.MeasureId, pID = MV.ProviderId }
这允许使用多个表列的条件
如果有人能帮我更有效地重写,我将不胜感激
谢谢。对不起,我没有看到你的第二个问题。 最终的LINQ查询(包括Max)将实现您想要的功能,如下所示:
var query = from td in transactionDetails
join p in providers on td.TrustCode equals p.Code
join m in measures on td.MetricCode equals m.InternalId
join mv in measureValues on new { mId = m.Id, pId = p.Id } equals new { mId = mv.MeasureId, pId = mv.ProviderId }
where td.BatchId == batchId && td.RowAction == "A"
&& (m.Type == 7 || m.Type == 8) && td.Value != mv.Value
select new { td, p, m, mv } into queryList
group queryList by new { queryList.mv.MeasureId, queryList.mv.ProviderId } into groupedList
select new {
groupedList.Key.MeasureId,
groupedList.Key.ProviderId,
mostRecentReportingDate = groupedList.Max(g => g.mv.ReportingDate) };
我对提供者、度量值等集合使用了简化名称,您可以将真正的提供者放在那里
此LINQ查询将返回原始SQL查询的结果,并将尽可能由SQL Server进行优化,对于LINQ to DB的优化,您可以做的不多
祝你好运 这会出现错误,提示“匿名类型不能有多个同名属性”p.Id。这正是我被困的地方。你能详细说明你的答案吗?你得到这个答案是因为anon试图为P.Id值命名属性Id,但它已经存在于M.Id中。如果M的Id字段名是mId,而P的Id字段名是pId,这就可以了,但是因为两个表中的列共享相同的名称,所以anon无法处理歧义。这就是为什么你为自己发布的新的{mId=M.Id,pId=P.Id}的答案是有效的。关于如何选择MAXmv.ReportingDate的任何建议??谢谢Josh,因为我是从VS开始回复的,我错过了两个属性的名称相同:PUBG,当然,请参阅我的单独答案谢谢你的上述详细解释。