Пожалуйста, помогите мне преобразовать запрос Linq в запрос SQL Desperate

Я хорошо разбираюсь в LINQ, но не в SQL. Я понимаю, что курсоры ужасны и не должны использоваться. Я довольно хорошо знаю синтаксис SQL, но я пытаюсь понять, как преобразовать этот запрос и обновить его до SQL из Linq. Я не знаю, как пройти через Foreach SQL без использования курсоров, и я немного потерялся в том, что делать дальше.

Как видите, я просматриваю всю таблицу примерно из 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();

person SpoiledTechie.com    schedule 29.12.2009    source источник
comment
Ха-ха, Utopia, я много в нее играл, я был тем, кто написал Utopia Simulator и Utopia Formatter версии 1 и 2 :)   -  person Aviad P.    schedule 29.12.2009
comment
2005 Sql... Что-нибудь еще? Авиад, я человек, работающий над UtopiaPimp...   -  person SpoiledTechie.com    schedule 29.12.2009


Ответы (2)


Если я правильно понимаю, вы пытаетесь выполнить запрос на обновление. Во-первых, если вы можете воспользоваться предложением Джона Скита и вам удобнее работать с 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 более одной строки с одним и тем же идентификатором провинции? Почему ты идешь на первое?

person Asaf R    schedule 29.12.2009
comment
Как мне на самом деле просмотреть каждую строку данных и обновить каждую строку? Действительно ли этот запрос делает это? - person SpoiledTechie.com; 29.12.2009

Что ж, в первую очередь вам следует выполнить соединение — в настоящее время вы выполняете два дополнительных запроса для каждой строки таблицы, что невероятно неэффективно. Вот пример соединения:

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, а не только первый, но я предполагаю, что это в любом случае первичные ключи, так что это не будет проблемой.

РЕДАКТИРОВАТЬ: я должен отметить, что решение Асафа является предпочтительным с точки зрения эффективности. Нет смысла возвращать все данные клиенту, когда база данных может сделать все это сама.

person Jon Skeet    schedule 29.12.2009
comment
Я могу только представить, что Linqpad все еще не может справиться с этим и выдает ошибку... Ошибки обычно приходят с исключением нехватки памяти... - person SpoiledTechie.com; 29.12.2009
comment
Спасибо, Джон. Несмотря на то, что ты дал мне правильный ответ, я бы хотел, чтобы он не выдал ошибку. Кажется, он продолжал сталкиваться с исключением нехватки памяти, потому что Linqpad продолжал выдавать оператор SQL после каждой операции... - person SpoiledTechie.com; 29.12.2009
comment
@Scott: Странно, что он выдает оператор SQL после каждой операции ... какой оператор? - person Jon Skeet; 29.12.2009