2012-06-26 3 views
1

У меня есть два запроса, которые мне нужно объединить в 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 
       }; 

Это кажется чрезвычайно многословным/круговым для меня. Есть ли лучший способ написать/подойти к этому, чтобы уменьшить/упростить код?

+0

FYI Я никогда не использую синтаксис лямбда (ваш последний пример), поскольку он не очень читается, особенно с несколькими объединениями. При выполнении объединений я всегда использую синтаксис выражения (ваши первые несколько примеров). Кроме того, вы прокомментируете, что ваши примеры являются подробными, я не вижу значительно более короткого способа написать это в TSQL. –

+0

@ Ник, я действительно очень хотел его избежать, но я не мог понять, как это работает. При работе с запросами я определенно предпочитаю использовать синтаксис выражения над синтаксисом метода, поскольку он просто «имеет смысл». – Kittoes0124

+0

Не будучи большим на L2EF, можно было бы обменять эти суммы условными счетами? – user7116

ответ

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. Я думаю ...

+0

Я мог бы поклясться, что пробовал это раньше, и, наверное, я испортил синтаксис где-то, потому что он отлично работает сейчас. Гораздо лучше, чем вызов метода, который у меня был раньше, спасибо! Теперь я могу сделать это без двух почти идентичных анонимных типов? – Kittoes0124

+0

@ Kittoes попробуйте мое редактирование. –

+0

Единственное, что мне не нравится в том, что анонимный тип создан анонимным типом, содержащим два других анонимных типа, а не по-настоящему объединенный. – Kittoes0124

Смежные вопросы