У меня есть два запроса, которые мне нужно объединить в LINQ, которые оба происходят из одной таблицы. Причина этого в том, что один из запросов должен получить максимальное количество полей за каждый день, а затем суммировать дни вместе, где второй запрос может просто суммировать все сразу с места в карьер. Вот первый вопрос:Это объединение LINQ-to-Entities кажется слишком сложным, я что-то делаю неправильно?
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),
};
Это вторая:
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
};
Это кажется чрезвычайно многословным/круговым для меня. Есть ли лучший способ написать/подойти к этому, чтобы уменьшить/упростить код?
FYI Я никогда не использую синтаксис лямбда (ваш последний пример), поскольку он не очень читается, особенно с несколькими объединениями. При выполнении объединений я всегда использую синтаксис выражения (ваши первые несколько примеров). Кроме того, вы прокомментируете, что ваши примеры являются подробными, я не вижу значительно более короткого способа написать это в TSQL. –
@ Ник, я действительно очень хотел его избежать, но я не мог понять, как это работает. При работе с запросами я определенно предпочитаю использовать синтаксис выражения над синтаксисом метода, поскольку он просто «имеет смысл». – Kittoes0124
Не будучи большим на L2EF, можно было бы обменять эти суммы условными счетами? – user7116