C# 将SQL查询转换为Linq(包含左连接)

C# 将SQL查询转换为Linq(包含左连接),c#,sql,linq,linq-to-entities,C#,Sql,Linq,Linq To Entities,我有一个在SQL中运行得很好的查询,但我正在最艰难地将它转换为linq。该表(下表1)包含多种记录类型的状态更改。连接需要设置两个字段来创建有效的连接:SubmissionId(状态所属表的主键)和SubmissionTypeId(确定状态所属的表) 我在x.DefaultIfEmpty()中使用into x from y进行了几次迭代,但我无法在正确的位置设置where子句。我需要从表1开始查询,因为这是值的来源 作为一种解决方法,我将查询分为两部分,并将状态数据按顺序添加到列表中,但似乎有更

我有一个在SQL中运行得很好的查询,但我正在最艰难地将它转换为linq。该表(下表1)包含多种记录类型的状态更改。连接需要设置两个字段来创建有效的连接:SubmissionId(状态所属表的主键)和SubmissionTypeId(确定状态所属的表)

我在x.DefaultIfEmpty()中使用into x from y进行了几次迭代,但我无法在正确的位置设置where子句。我需要从表1开始查询,因为这是值的来源

作为一种解决方法,我将查询分为两部分,并将状态数据按顺序添加到列表中,但似乎有更好的方法


谢谢。

我认为SQL的直接翻译如下:

var q = from ds in table1
        where ds.SubmissionTypeId == 1 || ds.SubmissionTypeId == 2
        from di in table2
        from dr in table2
        where (ds.SubmissionTypeId == 2 && ds.SubmissionId == di.Id)
           || (ds.SubmissionTypeId == 1 && ds.SubmissionId == dr.Id)
        select ds;
var q = from ds in table1
        where (ds.SubmissionTypeId == 2 && table2.Any(di => ds.SubmissionId == di.Id))
           || (ds.SubmissionTypeId == 1 && table3.Any(dr => ds.SubmissionId == dr.Id))
        select ds;
然而,这似乎不太可能是你想要的。如果我可以推测一下你想要的逻辑是什么,我想你想要的更像这样:

var q = from ds in table1
        where ds.SubmissionTypeId == 1 || ds.SubmissionTypeId == 2
        from di in table2
        from dr in table2
        where (ds.SubmissionTypeId == 2 && ds.SubmissionId == di.Id)
           || (ds.SubmissionTypeId == 1 && ds.SubmissionId == dr.Id)
        select ds;
var q = from ds in table1
        where (ds.SubmissionTypeId == 2 && table2.Any(di => ds.SubmissionId == di.Id))
           || (ds.SubmissionTypeId == 1 && table3.Any(dr => ds.SubmissionId == dr.Id))
        select ds;

非常感谢。我没有尝试在where子句中使用.Any函数。我要试一试。