我非常精通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();
答案 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的解决方案在效率方面更为可取。当数据库可以自行完成所有数据时,将所有数据提取回客户端是没有意义的。