Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL到LINQ处理左外部联接中的匹配_C#_Sql_.net_Linq - Fatal编程技术网

C# 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

我正在尝试将下面的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.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很高兴我能帮上忙。干杯