1

LINQにはかなり精通していますが、SQLには精通していません。カーソルはひどいので使用すべきではないことを理解しています。私はSQL構文をよく知っていますが、このクエリを変換してLinqからSQLに更新する方法を理解しようとしています。カーソルを使用せずにForeachofSQLを実行する方法がわかりません。次に、何をすべきかについて少し迷っています。

ご覧のとおり、約150,000行のテーブル全体を調べているので、Linqpadは更新を処理できないため、SQLでこれを実行する必要があります。

最初のテーブルの各レコードを反復処理してから、他の2つのテーブルでGUIDを見つけ、それらの2つのテーブルからそのデータを取得して、元のテーブルを更新します。

誰か助けてもらえますか?皆さんありがとう!!!!!

  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

このクエリは2つのテーブルを結合し、各行を両方のテーブルを含む「長い」行にします。各行のいくつかのフィールドの更新に進みます。

残りのUtopia_Province_Data_Captured_Gensのフィールドは、User_IDの場合と同じ方法で設定します。コードの2番目のテーブルに対して、同じようにUtopia_Province_InfosをUtopia_Province_Identifiersに置き換えます。

注:の使用法は考慮していませんFirstOrDefault。デフォルト値はUtopia_Province_Infosで直接設定することも、設定されていない値を更新することもできます(where句を使用)。「最初」について-Utopia_Province_Infosに同じProvince_IDを持つ行が複数ありますか?なぜあなたは最初に行くのですか?

于 2009-12-29T09:17:10.287 に答える
1

そもそも結合を行う必要があります。現在、テーブルの各行に対して2つの追加クエリを実行していますが、これは非常に非効率的です。結合の例を次に示します。

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のソリューションが効率の点で好ましいことに注意する必要があります。データベースがすべてを実行できる場合、すべてのデータをクライアントにフェッチして戻す意味はありません。

于 2009-12-29T07:54:39.930 に答える