1

我精通LINQ,但不精通SQL。我知道游标很可怕,不应该使用。我非常了解 SQL 语法,但我试图弄清楚如何将此查询转换为从 Linq 更新为 SQL。我不知道如何在不使用游标的情况下通过 SQL 的 Foreach,而且我对下一步该做什么有点迷失。

如您所见,我正在浏览大约 150,000 行的整个表 Linqpad 无法处理更新,因此我需要在 SQL 中完成此操作。

我遍历第一个表中的每条记录,然后在另外两个表中找到一个 Guid 并从这两个表中提取该数据并更新原始数据。

任何人都可以帮忙吗?谢谢大家!!!!

  CS_Code.UtopiaDataContext db = new CS_Code.UtopiaDataContext();
        var getFirst = (from xx in db.Utopia_Province_Data_Captured_Gens
                        select xx);
        foreach (var item in getFirst)
        {
            var updateItem = (from xx in db.Utopia_Province_Infos
                              where xx.Province_ID == item.Province_ID
                              select xx).FirstOrDefault();
            if (updateItem != null)
            {
                item.Owner_User_ID = updateItem.User_ID;
                item.Last_Login_For_Province = updateItem.Last_Login_Province;
                item.Date_Time_User_ID_Linked = updateItem.Date_Time_Added;
                item.Added_By_User_ID = updateItem.Added_By_User_ID;
            }
            var updateItema = (from xx in db.Utopia_Province_Identifiers
                               where xx.Province_ID == item.Province_ID
                               select xx).FirstOrDefault();
            if (updateItema != null)
            {
                item.Owner_Kingdom_ID = updateItema.Owner_Kingdom_ID;
                item.Kingdom_ID = updateItema.Kingdom_ID;
                item.Province_Name = updateItema.Province_Name;
                item.Kingdom_Island = updateItema.Kingdom_Island;
                item.Kingdom_Location = updateItema.Kingdom_Location;
            }
        }
        db.SubmitChanges();
4

2 回答 2

3

如果我理解正确,您正在尝试执行更新查询。首先,如果您可以使用 Jon Skeet 的建议并且您对 LINQ 更满意,那么就去做吧。SQL 等价物应该类似于 -

UPDATE info
SET
  gens.Owner_User_ID = item.User_ID
  gens.Last_Login_For_Province = item.Last_Login_Province
FROM
  Utopia_Province_Infos as info 
  INNER JOIN Utopia_Province_Data_Captured_Gens as gens 
  ON info.Province_ID = gens.Province_ID

此查询连接两个表,使每一行都成为包含两个表的“长”行。它继续更新每行中的一些字段。

您设置 Utopia_Province_Data_Captured_Gens 的其余字段的方式与使用 User_ID 的方式相同。您对代码中的第二个表执行相同的操作,将 Utopia_Province_Infos 替换为 Utopia_Province_Identifiers。

注意:我没有考虑到您对FirstOrDefault. 您可以直接在 Utopia_Province_Infos 中设置默认值,或者简单地更新尚未设置的值(使用 where 子句)。关于“第一” - Utopia_Province_Infos 中是否有不止一行具有相同的 Province_ID?你为什么要抢第一个?

于 2009-12-29T09:17:10.287 回答
1

好吧,您应该首先进行连接 - 目前您正在为表的每一行执行两个额外的查询,这非常低效。下面是一个连接示例:

var results = from xx in db.Utopia_Province_Data_Captured_Gens
              join yy in db.Utopia_Province_Infos 
                       on xx.Province_ID equals yy.Province_ID
              select new { item = xx, updateItem = yy };
foreach (var result in results)
{
    result.item.Owner_User_ID = result.updateItem.User_ID;
    result.item.Last_Login_For_Province = result.updateItem.Last_Login_Province;
    result.item.Date_Time_User_ID_Linked = result.updateItem.Date_Time_Added;
    result.item.Added_By_User_ID = result.updateItem.Added_By_User_ID;
}

// Ditto for second query

请注意,这将更新所有匹配Province_IDs 的项目,而不仅仅是第一个,但我猜这些都是主键,所以这不会是一个问题。

编辑:我应该注意到,Asaf 的解决方案在效率方面更可取。当数据库可以自己完成所有数据时,将所有数据返回给客户端是没有意义的。

于 2009-12-29T07:54:39.930 回答