2

Linqtoエンティティを使用してデータセットの2つのリストを取得しています。どちらも同じデータベースにありますが、カレンダーに統合されているため、1つのテーブルをタスクテーブルに変換する必要があります。ここで極端に詳しく説明する価値はないと思いますが、IDの照合と新しいタスクオブジェクトの作成のプロセスをスピードアップしたいと思います。これは1回限りのスニペットなので、低速でもプログラムを一晩実行したままにしておくことができます。ただし、今後の参考のために、効率を上げるための提案をお願いします。

var accounts = data.Accounts.ToList().OrderBy(a => a.ID);
Incidents[] Incidents = data.Incidents.ToArray();

        for (int i=0;i<Incidents.Length;i++)
        {
            foreach (var a in accounts)
            {
                if (a.Acct_CID == Incidents[i].CustomerID)
                {
                    Tasks t = new Tasks();
                    t.creator_id = a.ID;
                    t.start_date = Incidents[i].DateOpened;
                    t.end_date = Incidents[i].DateCLosed;
                    t.product_code = Incidents[i].ProductCode;
                    t.install_type = Incidents[i].InstallType;
                    t.os = Incidents[i].OSType;
                    t.details = Incidents[i].Description;
                    t.solution = Incidents[i].Solution;
                    t.creator_name = Incidents[i].TechID;
                    t.category = Incidents[i].Title;
                    t.text = "Ticket for" + " " + Incidents[i].Name;
                    if (t.end_date == DateTime.MinValue || t.end_date == null)
                        t.status_id = 6;
                    else t.status_id = 7;
                    data.Tasks.Add(t);
                    break;
                }
            }
        }
        data.SaveChanges();
4

5 に答える 5

3

テーブルを結合してその場でタスクを作成してみませんか?

var tasks = from i in data.Incidents
            join a in data.Accounts on i.CustomerID equals a.Acct_CID
            select new Tasks()
            {
                creator_id = a.ID,
                start_date = i.DateOpened,
                end_date = i.DateCLosed
                // ...
            };

ところで、ここでは順序付けが意味をなさないと思います。したがって、作成したタスクをデータベースに追加する順序は重要ではありません。

// Query will not be executed until here
foreach(var task in tasks)
   data.Tasks.Add(task);
data.SaveChanges();
于 2012-10-15T21:09:47.343 に答える
3

私はJoinDBで結果を出します

var joinedResult = data.Accounts.Join(data.Incidents, 
                                      a => a.Acct_CID, 
                                      i => i.CustomerID, 
                                      (a, i) => new { Account = a, Incident = i });

foreach (var item in joinedResult)
{
    Tasks t = new Tasks();
    t.creator_id = item.Account.ID;
    t.start_date = item.Incident.DateOpened;
    ........

}
于 2012-10-15T21:11:02.180 に答える
1

この行を置き換えます

var accounts = data.Accounts.ToList().OrderBy(a => a.ID);

これとともに

var accounts = data.Accounts.OrderBy(a => a.ID).ToList();

これにより、データベースが並べ替えを実行し、並べ替えられた結果をキャッシュします。foreachあなたが今持っているものはすべてを引き出し、ループに到達するたびにそれらをソートします(accounts再び列挙されます)。

大幅な改善が見込めるとは言えませんが、データセットが十分に大きい場合は、大きなリストを何度も並べ替えると、確実に速度が低下します。


accounts一見すると、毎回ソートしているだけでなく、レコードの小さなサブセットのみを探しているように見えますが、配列全体を反復処理しています。交換を検討

    foreach (var a in accounts)
        {
            if (a.Acct_CID == Incidents[i].CustomerID)
            {

      foreach (var a in accounts.Where(acct => acct.Acct_CID == Incidents[i].CustomerID))
      {
于 2012-10-15T20:55:19.767 に答える
1

アカウントのルックアップを作成します

var accountsLookup = data.Accounts.ToLookup(a => a.Acct_CID);
foreach (var incident in data.Incidents)
{
    foreach (var a in accountsLookup[incident.CustomerID])
    {
        Tasks t = new Tasks();
        t.creator_id = a.ID;
        ...
    }
}
data.SaveChanges();

アカウントが一意の場合は、辞書を作成することもできます

var accountsDict = data.Accounts.ToDictionary(a => a.Acct_CID);
foreach (var incident in data.Incidents)
{
    Account a;
    if (accountsDict.TryGetValue(incident.CustomerID, out a)
    {
        Tasks t = new Tasks();
        t.creator_id = a.ID;
        ...
    }
}
data.SaveChanges();

これは、最初のバリアントよりも高速です。辞書には、そのサイズに依存しない一定のルックアップ時間があります。したがって、基本的にループの実行時間はO(n)になります。元の実装の実行時間はO(n ^ 2)です。

于 2012-10-15T21:13:29.587 に答える
0
    var tasks = (from i in data.Incidents
                     join a in data.Accounts on i.CustomerID equals a.Acct_CID
                     select new
                     {
                         creator_id = a.ID,
                         start_date = i.DateOpened,
                         end_date = i.DateCLosed,
                         product_code = i.ProductCode,
                         install_type = i.InstallType,
                         os = i.OSType,
                         details = i.Description,
                         solution = i.Solution,
                         creator_name = i.TechID,
                         category = i.Title,
                         text = "Ticket for" + " " + i.Name,
                         status_id = 7
                     }).AsEnumerable().Select(x => new
                         {
                             x.creator_id,
                             x.start_date,
                             x.end_date,
                             x.product_code,
                             x.os,
                             x.details,
                             x.solution,
                             x.creator_name,
                             x.category,
                             x.text,
                             x.install_type,
                             x.status_id
                         });


        foreach (var item in tasks)
        {
            Tasks t = new Tasks();
            t.os = item.os;
            t.id = item.creator_id;
            t.install_type = item.install_type;
            t.start_date = item.start_date;
            t.end_date = item.end_date;
            t.solution = item.solution;
            t.details = item.details;
            t.creator_name = item.creator_name;
            t.category = item.category;
            t.text = item.text;
            t.product_code = item.product_code;
             if (t.end_date == DateTime.MinValue || t.end_date == null)
                 t.status_id = 6;
             else t.status_id = 7;
             data.Tasks.Add(t);
        }
        data.SaveChanges();
于 2012-10-17T16:05:37.327 に答える