请帮我将Linq查询转换为SQL查询...绝望

时间:2009-12-29 07:49:46

标签: sql linq sql-server-2005 linqpad

我非常精通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();

2 个答案:

答案 0 :(得分:3)

如果我理解正确,您正在尝试update query。首先,如果您可以使用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

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

您可以使用与User_ID相同的方式设置Utopia_Province_Data_Captured_Gens的其余字段。 您可以使用Utopia_Province_Identifiers替换Utopia_Province_Infos 代码中的第二个表。

注意:我没有考虑您对FirstOrDefault的使用情况。您可以直接在Utopia_Province_Infos中设置默认值,或者只是更新尚未设置的值(使用where子句)。关于'First' - 在Utopia_Province_Infos中是否有多行具有相同的Province_ID?你为什么要去第一个?

答案 1 :(得分: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_ID项目,而不仅仅是第一项,但我猜这些都是主键,所以它不会是一个问题。

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