【问题标题】:Convert SQL Query to Linq (contains left joins)将 SQL 查询转换为 Linq(包含左连接)
【发布时间】:2011-01-14 22:21:31
【问题描述】:

我有一个可以在 SQL 中完美运行的查询,但我正忙着将它转换为 linq。该表(下面的表 1)包含多种记录类型的状态更改。连接需要设置两个字段来创建有效连接:SubmissionId(状态所属表的pk)和SubmissionTypeId(确定状态所属的表)。

CREATE TABLE ##Table1 (Id int, Status varchar(50), SubmissionId int, SubmissionTypeId int)
insert into ##Table1(Id, Status, SubmissionId, SubmissionTypeId)
select 1 ,'Status1' ,1 , 1    
union select 2,'Status2',1, 2

CREATE TABLE ##Table2 (ID int, Value varchar(50))
insert into ##Table2 (ID, Value)
select 1, 'Value1Table2'

CREATE TABLE ##Table3 (ID int, Value varchar(50))
insert into ##Table3 (ID, Value)
select 1, 'Value1Table3'

select ds.* from ##Table1 ds
left join ##Table2 di
on ds.SubmissionId = di.Id and ds.SubmissionTypeId = 2
left join ##Table2 dr
on ds.SubmissionId = dr.Id and ds.SubmissionTypeId = 1
where SubmissionTypeId in (1,2)

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

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

谢谢。

【问题讨论】:

    标签: c# sql linq linq-to-entities


    【解决方案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;
    

    【讨论】:

    • 谢谢。我没有尝试在 where 子句中使用 .Any 函数。我会试一试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    相关资源
    最近更新 更多