当前位置: 首页 > 面试题库 >

将SQL查询转换为Linq(包含左联接)

窦哲彦
2023-03-14
问题内容

我有一个在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)

我已经尝试过使用x.DefaultIfEmpty()中的y到x进行多次迭代,并且无法在正确的位置设置where子句。我需要从Table1开始查询,因为那是值的来源。

作为一种变通方法,我将查询分为两部分,只是将状态数据顺序添加到列表中,但是看来必须有更好的方法。

谢谢你。


问题答案:

我认为您的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;


 类似资料:
  • 我正在尝试转换以下查询: 到标准Hibernate查询,但肯定错过了一些东西,因为我得到了以下错误: 当我尝试时: 很抱歉,表/列命名错误,但这是敏感数据。

  • 问题内容: 基本上,我想使用linq进行此SQL查询: 这是我想出的: 但 在 后 o.Identifier 无效。 关键字IN的正确语法是什么? 问题答案: 我有点晚了,但是我做了一个演示! 正如其他人所说,我始终使用Contains:

  • 但是,我的查询生成器是错误的。它会显示错误消息 SQLState[42000]:语法错误或访问冲突:1064您的SQL语法中有错误;查看与您的MySQL server版本相对应的手册以获得正确的语法 和生成的SQL SQL:从左联接中选择.*(内联接对。=。和。=。和 谁能帮我解决我的问题?多谢了。

  • 任何帮助都将不胜感激!

  • 问题内容: 我计划在子查询中使用它,但无法找出将以下查询转换为LINQ的正确语法: 问题答案:

  • 问题内容: 我想将以下SQL查询转换为Elasticsearch之一。谁能帮上忙 我尝试了以下方法: 但不确定我是否做对了,因为它无法验证结果。似乎要在聚合内添加查询。 问题答案: 假设您使用Elasticsearch 2.x,则有可能在Elasticsearch中 具有 -semantics。我不知道2.0之前的可能性。 您可以使用新的Pipeline Aggregation Bucket Se