C# SQL到LINQ处理左外部联接中的匹配
我正在尝试将下面的SQL转换为LINQ查询,我一直在使用左外联接中的匹配项筛选结果C# SQL到LINQ处理左外部联接中的匹配,c#,sql,.net,linq,C#,Sql,.net,Linq,我正在尝试将下面的SQL转换为LINQ查询,我一直在使用左外联接中的匹配项筛选结果 SELECT @batchID , IQ1.ID, @environment , 'IRD', IQ1.ReportingDate, IQ1.Match FROM ( SELECT TD.*, RD.Match FROM TransactionDetail TD INNER JOIN .dbo.Measure M ON M.Intern
SELECT @batchID , IQ1.ID, @environment , 'IRD', IQ1.ReportingDate, IQ1.Match
FROM (
SELECT TD.*, RD.Match
FROM TransactionDetail TD
INNER JOIN .dbo.Measure M ON M.InternalID = TD.MetricCode-- and TD.BatchID = 'e07f9855-b286-4406-9189-5cfb2a7914c8'
LEFT OUTER JOIN (
SELECT tmp.ID, tmp.ReportingDate, 1 AS Match
FROM tmp
) AS RD ON RD.ID = M.Frequency AND RD.ReportingDate = TD.ReportingDate
WHERE RD.Match IS NULL AND
TD.BatchID = @batchID AND
NOT EXISTS (SELECT TransactionFailureReasonID FROM TransactionDetailFailureReasons R WHERE R.TransactionDetailID = TD.ID and R.TransactionFailureReasonID = 'NRD') AND
NOT EXISTS (SELECT TransactionFailureReasonID FROM TransactionDetailFailureReasons R WHERE R.TransactionDetailID = TD.ID and R.TransactionFailureReasonID = 'RDP') AND
NOT EXISTS (SELECT TransactionFailureReasonID FROM TransactionDetailFailureReasons R WHERE R.TransactionDetailID = TD.ID and R.TransactionFailureReasonID = 'RDF')
) AS IQ1
到目前为止,我取得了如下成就:
// Prepare data for left outer join
var rd = (from tt in result
select new { ID = tt.Id, tt.ReportingDate });
// inner join
var td = TransactionDetail.Join(
MesureTb,
t => t.MetricCode,
m => m.InternalId,
(t, m) => new
{
t.Id,
t.RowAction,
t.BatchId,
t.TrustCode,
t.MetricCode,
t.ReportingDate,
t.Value,
t.UpperBenchmark,
t.LowerBenchmark,
m.InternalId,
Frequency = m.Frequency
});
// left outer join
var failureTransactionDetail = (from p in td
join q in rd on new { ReportingDate = (DateTime)p.ReportingDate, ID = p.Frequency } equals new { q.ReportingDate, q.ID }
into LJ
//select new { p.Id, p.BatchId, p.ReportingDate, RD = q.ReportingDate, q.ID, p.Frequency });
from value in LJ.DefaultIfEmpty()
//where p.BatchId == batchId
select new {p.BatchId, p.Id, Match = 1, p.ReportingDate } into DJ
// LEFT OUTER JOIN
where DJ.BatchId == batchId
////&& DJ.Match == 0
&& !(TransactionDetailFailureReasons.Any(m => m.TransactionDetailId == DJ.Id && m.TransactionFailureReasonId == "NRD"))
&& !(TransactionDetailFailureReasons.Any(m => m.TransactionDetailId == DJ.Id && m.TransactionFailureReasonId == "RDP"))
&& !(TransactionDetailFailureReasons.Any(m => m.TransactionDetailId == DJ.Id && m.TransactionFailureReasonId == "RDF"))
select new { DJ.Id, DJ.ReportingDate, DJ.BatchId } );
我的问题是如何在Linq中的SQL中获得与1相似的结果
有人能给我引路吗?目前,SQL查询基于匹配值返回2个结果,结果为null,但LInq返回8个结果,因为它没有过滤左连接上的匹配
非常感谢您的帮助
提前谢谢。我只是想帮你一下,因为这个问题有点不清楚。但是,只要将sql语句与linq查询进行比较,我就可以看出您可能正在尝试筛选以下位置:RD.Match为NULL?如果这个假设是正确的,那么linq查询就有问题了 鉴于以下对象:
public class TransactionDetail
{
public TransactionDetail(int id,
int batchId,
int metricCode,
DateTime reportingDate)
{
Id = id;
BatchId = batchId;
MetricCode = metricCode;
ReportingDate = reportingDate;
}
public int Id { get; }
public int BatchId { get; }
public int MetricCode { get; }
public DateTime ReportingDate { get; }
}
public class Measure
{
public Measure(int internalId,
int frequency)
{
InternalId = internalId;
Frequency = frequency;
}
public int InternalId { get; }
public int Frequency { get; }
}
public class Tmp
{
public Tmp(int id,
DateTime reportingDate)
{
Id = id;
ReportingDate = reportingDate;
}
public int Id { get; }
public DateTime ReportingDate { get; }
}
示例代码:
static void Main(string[] args)
{
var transactionDetails = new List<TransactionDetail>
{
new TransactionDetail(id: 1, batchId: 1, metricCode: 1, reportingDate: new DateTime(2019, 1, 1)),
new TransactionDetail(id: 2, batchId: 1, metricCode: 2, reportingDate: new DateTime(2019, 1, 1))
};
var matches = new List<Measure>
{
new Measure(internalId: 1, frequency: 1),
new Measure(internalId: 2, frequency: 3)
};
var temporaryList = new List<Tmp>
{
new Tmp(1, new DateTime(2019, 1, 1)),
};
var transDetails = transactionDetails.Join(
matches,
t => t.MetricCode,
m => m.InternalId,
(t, m) => new
{
t.Id,
t.BatchId,
t.MetricCode,
t.ReportingDate,
m.InternalId,
m.Frequency
})
.ToList();
var failureTransactionDetail = transDetails
.GroupJoin(temporaryList,
trandetail => new { trandetail.ReportingDate, Id = trandetail.Frequency },
tmp => new { tmp.ReportingDate, tmp.Id },
(trandetail, tmp) => new { trandetail, tmp })
.SelectMany(t => t.tmp.DefaultIfEmpty(), (t, value) => new { t, value, Matches = 1 })
.Where(arg => !arg.t.tmp.Any());
Console.WriteLine(JsonConvert.SerializeObject(failureTransactionDetail, Formatting.Indented));
Console.ReadLine();
}
static void Main(字符串[]args)
{
var transactionDetails=新列表
{
新交易详情(id:1,batchId:1,metricCode:1,reportingDate:new DateTime(2019,1,1)),
新交易详情(id:2,批次id:1,度量代码:2,报告日期:新日期时间(2019,1,1))
};
var matches=新列表
{
新措施(内部ID:1,频率:1),
新措施(内部ID:2,频率:3)
};
var temporaryList=新列表
{
新Tmp(1,新日期时间(2019,1,1)),
};
var transDetails=transactionDetails.Join(
比赛,
t=>t.MetricCode,
m=>m.InternalId,
(t,m)=>新
{
t、 身份证,
t、 BatchId,
t、 公制代码,
t、 报告日期:,
m、 内在的,
m、 频率
})
.ToList();
var failureTransactionDetail=transDetails
.GroupJoin(临时列表,
trandetail=>new{trandetail.ReportingDate,Id=trandetail.Frequency},
tmp=>new{tmp.ReportingDate,tmp.Id},
(trandetail,tmp)=>新的{trandetail,tmp})
.SelectMany(t=>t.tmp.DefaultIfEmpty(),(t,value)=>new{t,value,Matches=1})
.Where(arg=>!arg.t.tmp.Any());
WriteLine(JsonConvert.SerializeObject(failureTransactionDetail,Formatting.Indented));
Console.ReadLine();
}
检查输出,您将看到不需要Match=1
.Where(arg=>!arg.t.tmp.Any())
将等效于sql查询中的RD.Match为NULL
希望这能帮你找到正确的方向 在sql设置
1为Match
中,只输出所有行的数字1。你不应该设置Match=1而不是true吗?我确实尝试了1,但这不会过滤值,我假设我的Linq查询存在一些问题。非常感谢上面的内容,它确实帮助了很多。没问题@PUBG很高兴我能帮上忙。干杯