Получать изделия с перекрытиями типа datetime, используя LINQ


У меня есть база данных чат и я пытаюсь получить представление о том, сколько сотрудников одновременных чатов принимают. Я не уверен, что лучший способ сообщить об этом, поэтому я решил сделать список чатов в течение определенного периода, то для каждого из них отображается количество чатов, которые частично перекрываются, что в некотором роде.

Я в запросе 2 таблицы через Join но это просто, чтобы получить имя оператора. Поля, которые имеют соответствующие сроки:

DateTime? ChatRequests.Answered
DateTime? ChatRequests.Closed

Я думаю, что у меня все под контролем. Я просто хочу, чтобы увидеть, если кто может сказать мне, если я что-то упускаю, или если есть лучший подход к нему.

ChatRequests
.Where (cr => (cr.Created.AddHours (10).Date == DateTime.Now.AddDays (-1).Date))
.Where (cr => cr.OperatorID.HasValue)
.Join (
    Operators, 
    chat => chat.OperatorID.Value, 
    op => op.ID, 
    (chat, op) => 
        new  
        {
            chat = chat, 
            op = op
        }
)
.Select (
    g => 
        new  
        {
            Operator = g.op.FullName, 
            Answered = g.chat.Answered.Value.AddHours (10), 
            Closed = g.chat.Closed.Value.AddHours (10), 
            Duration = (Decimal)((g.chat.Closed.Value - g.chat.Answered.Value).TotalMinutes), 
            Company = g.chat.AccountName, 
            Contact = g.chat.ContactName, 
            OtherChatsInSamePeriod = ChatRequests
                        .Where (cr => (cr.OperatorID == g.chat.OperatorID))
                        .Where (cr => (cr.ID != g.chat.ID))
                        .Where (
                           cr =>    (cr.Answered.Value >= g.chat.Answered.Value && cr.Answered.Value <= g.chat.Closed.Value) 
                                     || (cr.Closed.Value >= g.chat.Answered.Value && cr.Closed.Value <= g.chat.Closed.Value)
                                     || (cr.Answered.Value < g.chat.Answered.Value && cr.Closed.Value > g.chat.Closed.Value)                        
            )
            .Count ()
        }
)


1926
4
задан 2 июля 2011 в 02:07 Источник Поделиться
Комментарии
1 ответ

Быстрая версия ваше окончательное предложение where:

cr.Answered.Value <= g.chat.Closed.Value && cr.Closed.Value >= g.chat.Answered.Value

Если вы не хотите, чтобы подсчитать конечную точки перекрытия (например, звонок заканчивается ровно в 9:59 и вызвать начало ровно в 9:59 не пересекаются), а затем использовать:

cr.Answered.Value < g.chat.Closed.Value && cr.Closed.Value > g.chat.Answered.Value

Вы также можете удалить .Где (СГ => (КР.Идентификатор != г.чат.ИД)) состояние и вычесть 1 от общего количества, поскольку оно должно быть гарантировано, что существует только один вызов происходит с помощью того же оператора за тот же период времени в вопрос.

2
ответ дан 6 июля 2011 в 08:07 Источник Поделиться