C# 将Linq代码块转换为SQL
主要目标是将适当的数据从一个表迁移到另一个表,由于我的sql技能不高,我使用linq和foreach语句编写了逻辑,以完成所需的工作。然而,需要在不同的环境中运行sql脚本,因此我开始将以前编写的内容转换为sql,而我的sql思维过程在GroupBy和looping shores被破坏了 以下是我的尝试,它实际上返回了一个准确的数据结果: 下面是我击中岩石的代码: 主要挑战: GroupingBy,返回包含其他列的内部结果集 循环遍历内部结果集,通过PropID进行区分并返回另一个结果集 循环遍历新集合,调用insert过程并传递参数 更新: 我选择斯特潘的答案是因为它简单;但是,我遇到了这样一种情况,即我需要在返回第三列时按多个列进行区分,因此我必须执行以下操作:C# 将Linq代码块转换为SQL,c#,sql-server,linq,C#,Sql Server,Linq,主要目标是将适当的数据从一个表迁移到另一个表,由于我的sql技能不高,我使用linq和foreach语句编写了逻辑,以完成所需的工作。然而,需要在不同的环境中运行sql脚本,因此我开始将以前编写的内容转换为sql,而我的sql思维过程在GroupBy和looping shores被破坏了 以下是我的尝试,它实际上返回了一个准确的数据结果: 下面是我击中岩石的代码: 主要挑战: GroupingBy,返回包含其他列的内部结果集 循环遍历内部结果集,通过PropID进行区分并返回另一个结果集 循环遍
我不明白您到底想做什么,但您的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;
现在,如果这是一个大的结果集,您可能会想考虑一些事情,比如使光标只向前移动、只读以及避免锁定,但是这样就可以在不使示例过于复杂的情况下理解一般的想法。您可以从以下位置的文档中获得更详细的信息: