1

LINQで組み合わせる必要のある2つのクエリがあり、どちらも実際には同じテーブルからのものです。この理由は、クエリの1つが各日のフィールドの最大値を取得してから、2番目のクエリがすべてをすぐに合計できる日数を合計する必要があるためです。最初のクエリは次のとおりです。

var queryDownload = from p in
                        (from p in almdbContext.cl_contact_event
                         where p.time_of_contact >= startDate && p.time_of_contact < endDate && p.input_file_name.Contains(inputFileName) && listName.Contains(listName)
                         group p by new
                         {
                             date = EntityFunctions.CreateDateTime(p.time_of_contact.Value.Year, p.time_of_contact.Value.Month, p.time_of_contact.Value.Day, 0, 0, 0),
                             listName = p.contact_list_name
                         } into g
                         select new
                         {
                             date     = g.Key.date,
                             listName = g.Key.listName,
                             download = g.Max(a => a.total_number_of_records)
                         })
                    group p by p.listName into g
                    select new
                    {
                        listName      = g.Key,
                        totalDownload = g.Sum(a => a.download),
                    };

これは2番目です:

var queryPenData = from p in almdbContext.cl_contact_event
                   where p.time_of_contact >= startDate && p.time_of_contact < endDate && p.input_file_name.Contains(inputFileName) && listName.Contains(listName)
                   group p by p.contact_list_name into g
                   select new
                   {
                       listName           = g.Key,
                       dials              = g.Sum(a => a.ov_dial_start_time != null ? 1 : 0),
                       agentConnects      = g.Sum(a => a.agent_login_name != null ? 1 : 0),
                       abandons           = g.Sum(a => a.response_status == "DAC" || a.response_status == "DAD" ? 1 : 0),
                       rightPartyContacts = g.Sum(a => a.response_status == "PTP" || a.response_status == "RPC" ? 1 : 0),
                       promiseToPays      = g.Sum(a => a.response_status == "PTP" ? 1 : 0),
                       talkTime           = g.Sum(a => EntityFunctions.DiffSeconds(a.ov_call_connected_time, a.ov_trunk_released_time)) ?? 0,
                       wrapTime           = g.Sum(a => EntityFunctions.DiffSeconds(a.ov_trunk_released_time, a.record_released_time)) ?? 0
                   };

そして、これはそれらを結合するクエリです。

var queryJoin = from qd in queryDownload
                join qp in queryPenData
                on qd.listName equals qp.listName
                select new
                {
                    listName           = qp.listName,
                    download           = qd.totalDownload,
                    dials              = qp.dials,
                    agentConnects      = qp.agentConnects,
                    abandons           = qp.abandons,
                    rightPartyContacts = qp.rightPartyContacts,
                    promiseToPays      = qp.promiseToPays,
                    talkTime           = qp.talkTime,
                    wrapTime           = qp.wrapTime
                };

これは私には非常に冗長で回りくどいようです。コードを縮小/簡素化するためにこれを記述/アプローチできるより良い方法はありますか?

4

1 に答える 1

2

あなたの最後の質問のために、あなたはこのようなことをすることができませんでしたか?

var queryJoin = from qd in queryDownload join qpd in queryPenData on qd.listname equals qpd....

これを行うことができるはずです:

var queryJoin = from qd in queryDownload
            join qp in queryPenData
            on qd.listName equals qp.listName
            select new
            {
                qp, qd
            };

私が言えることから、あなたはすでにデータを形成してqueryPenDataいるので、最終的な結合で新しい変数にデータを再割り当てする理由はありません。の匿名タイプにトラバースできるオブジェクトを選択するだけですqueryPenData。おもう...

于 2012-06-26T22:23:32.183 に答える