C# 将Linq代码块转换为SQL

C# 将Linq代码块转换为SQL,c#,sql-server,linq,C#,Sql Server,Linq,主要目标是将适当的数据从一个表迁移到另一个表,由于我的sql技能不高,我使用linq和foreach语句编写了逻辑,以完成所需的工作。然而,需要在不同的环境中运行sql脚本,因此我开始将以前编写的内容转换为sql,而我的sql思维过程在GroupBy和looping shores被破坏了 以下是我的尝试,它实际上返回了一个准确的数据结果: 下面是我击中岩石的代码: 主要挑战: GroupingBy,返回包含其他列的内部结果集 循环遍历内部结果集,通过PropID进行区分并返回另一个结果集 循环遍

主要目标是将适当的数据从一个表迁移到另一个表,由于我的sql技能不高,我使用linq和foreach语句编写了逻辑,以完成所需的工作。然而,需要在不同的环境中运行sql脚本,因此我开始将以前编写的内容转换为sql,而我的sql思维过程在GroupBy和looping shores被破坏了

以下是我的尝试,它实际上返回了一个准确的数据结果:

下面是我击中岩石的代码:

主要挑战:

GroupingBy,返回包含其他列的内部结果集 循环遍历内部结果集,通过PropID进行区分并返回另一个结果集 循环遍历新集合,调用insert过程并传递参数 更新:

我选择斯特潘的答案是因为它简单;但是,我遇到了这样一种情况,即我需要在返回第三列时按多个列进行区分,因此我必须执行以下操作:


我不明白您到底想做什么,但您的sql查询可以编写如下:

  SELECT DISTINCT bt.BookID
  FROM BooksTable AS bt
  JOIN PapersTable AS pt ON bt.BookID = pt.BookID
  JOIN PapersPropertiesTable AS ppt ON pt.PaperID = ppt.PaperID;
不需要内部查询。 不需要分组。 只需使用DISTINCT。 您需要使用INSERT INTO SELECT将此查询的结果插入到另一个表中:

  INSERT INTO Table2(BookID,PropID)
  SELECT DISTINCT bt.BookID, ppt.PropID
  FROM BooksTable AS bt
  JOIN PapersTable AS pt ON bt.BookID = pt.BookID
  JOIN PapersPropertiesTable AS ppt ON pt.PaperID = ppt.PaperID

我不明白您到底想做什么,但您的sql查询可以编写如下:

  SELECT DISTINCT bt.BookID
  FROM BooksTable AS bt
  JOIN PapersTable AS pt ON bt.BookID = pt.BookID
  JOIN PapersPropertiesTable AS ppt ON pt.PaperID = ppt.PaperID;
不需要内部查询。 不需要分组。 只需使用DISTINCT。 您需要使用INSERT INTO SELECT将此查询的结果插入到另一个表中:

  INSERT INTO Table2(BookID,PropID)
  SELECT DISTINCT bt.BookID, ppt.PropID
  FROM BooksTable AS bt
  JOIN PapersTable AS pt ON bt.BookID = pt.BookID
  JOIN PapersPropertiesTable AS ppt ON pt.PaperID = ppt.PaperID

如果您知道SQL&希望将其转换为LINQ 或者如果您知道LINQ&希望将其转换为SQL


最好的工具是

,如果您知道SQL并希望将其转换为LINQ 或者如果您知道LINQ&希望将其转换为SQL


最好的工具是

阅读您的问题和代码并从代码中推断一点,我的理解是,您希望检索具有相关纸张属性的BookID列表,然后为每个BookID执行一个存储过程。使用纯SQL方法而不是使用C编排调用来实现这一点的一种方法是使用游标代替LINQ查询的结果。下面是一个例子:

DECLARE migrate_cursor CURSOR
FOR
SELECT DISTINCT bt.BookID, ppt.PropID
FROM BooksTable AS bt
  INNER JOIN PapersTable AS pt
    ON bt.BookID = pt.BookID
  INNER JOIN PapersPropertiesTable AS ppt
    ON pt.PaperID = ppt.PaperID;

OPEN migrate_cursor;

FETCH NEXT FROM migrate_cursor  
INTO @bookId, @propId;  

WHILE @@FETCH_STATUS = 0  
BEGIN  
   EXECUTE my_insert_props_procedure @bookId, @propId

   FETCH NEXT FROM migrate_cursor  
   INTO @bookId, @propId;  
END;

CLOSE migrate_cursor;  
DEALLOCATE migrate_cursor;  

现在,如果这是一个大的结果集,您可能会想考虑一些事情,比如使光标只向前移动、只读以及避免锁定,但是这样就可以在不使示例过于复杂的情况下理解一般的想法。您可以从文档中获得更详细的信息,阅读您的问题和代码并从代码中推断出一点,我的理解是,您希望检索具有相关纸张属性的BookID列表,然后为每个BookID执行一个存储过程。使用纯SQL方法而不是使用C编排调用来实现这一点的一种方法是使用游标代替LINQ查询的结果。下面是一个例子:

DECLARE migrate_cursor CURSOR
FOR
SELECT DISTINCT bt.BookID, ppt.PropID
FROM BooksTable AS bt
  INNER JOIN PapersTable AS pt
    ON bt.BookID = pt.BookID
  INNER JOIN PapersPropertiesTable AS ppt
    ON pt.PaperID = ppt.PaperID;

OPEN migrate_cursor;

FETCH NEXT FROM migrate_cursor  
INTO @bookId, @propId;  

WHILE @@FETCH_STATUS = 0  
BEGIN  
   EXECUTE my_insert_props_procedure @bookId, @propId

   FETCH NEXT FROM migrate_cursor  
   INTO @bookId, @propId;  
END;

CLOSE migrate_cursor;  
DEALLOCATE migrate_cursor;  
现在,如果这是一个大的结果集,您可能会想考虑一些事情,比如使光标只向前移动、只读以及避免锁定,但是这样就可以在不使示例过于复杂的情况下理解一般的想法。您可以从以下位置的文档中获得更详细的信息: