Сложный запрос LINQ в рабочем процессе - PullRequest
1 голос
/ 04 марта 2011

У нас есть таблица «Документы».Каждый документ должен быть утвержден, прежде чем он станет активным.

Процесс утверждения документа требует нескольких участников.Например, сначала утверждается дизайнер, второй - исполнительный директор, третий - генеральный директор.Генеральный менеджер не может утвердить до руководителя.

В документе есть коллекция утверждающих.«У утверждающих» есть свойства «Индекс», «Имя-утверждающего» и «Утверждено».

Вопрос в том, как использовать LINQ для отображения списка документов, которые пользователь должен утвердить сейчас.Документы должны появиться в списке, когда конкретному пользователю нужно будет их утвердить.

До сих пор мы использовали следующий код ручной фильтрации:

   Public ReadOnly Property RequiresMyApproval() As Boolean

        Get


            If Me.Approved OrElse Me.Approvals.Count = 0 Then Return False

            Dim closestUnapproval = GetClosestUnapproval()

            Return (closestUnapproval IsNot Nothing AndAlso closestUnapproval.ParentUser.Oid = CurrentUser.Oid)

        End Get

    End Property


    Private Function GetClosestUnapproval() As DocumentApproval
        Dim closestUnapprovedIndex As Integer = -1
        Dim closestUnapproval As DocumentApproval = Nothing



        For Each approval In Me.Approvals
            If Not approval.Approved AndAlso approval.Index < closestUnapprovedIndex OrElse Not approval.Approved AndAlso closestUnapprovedIndex = -1 Then
                closestUnapprovedIndex = approval.Index
                closestUnapproval = approval
            End If
        Next


        Return closestUnapproval

    End Function

Ответы [ 2 ]

1 голос
/ 04 марта 2011

Если я правильно понимаю проблему:

//The person who we're building this query around
Approver me;

Documents
    .Where(d => !d.Approvers.Where(a => a == me).First().Approved)
    .Where(d => 
        d.SelectMany(x =>
            x.Approvers
            .Where(a => a.Index < me.Index)
            .Where(a => !a.Approved))
    .Count() == 0)

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

1 голос
/ 04 марта 2011

Я рекомендую вам использовать LinqKit (http://www.albahari.com/nutshell/linqkit.aspx) бесплатная библиотека, она помогает с динамическими запросами в LINQ ... Вы также можете использовать LinqPad для простого тестирования ваших запросов без необходимости что-либо кодировать сначала ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...