Linq - 子查询计数

时间:2013-01-10 18:37:36

标签: linq

问题:我试图在Linq中重写这个:

listOfUsersForReviewer是IEnumerable<User>

int countOfGreenUsers = 0;
foreach (var user in listOfUsersForReviewer)
{
    var u = (from reviewitems in context.ReviewItems
                join groupaccountlinks in context.GroupAccountLinks on reviewitems.GroupAccountID equals groupaccountlinks.GroupAccountID
                join reviews in context.Reviews on reviewitems.ReviewID equals reviews.ReviewID
                join applications in context.Applications on reviews.ApplicationID equals applications.ApplicationID
                join reviewers in context.Reviewers on applications.ResponsibleReviewerID equals reviewers.ReviewerID
                join accounts in context.Accounts on groupaccountlinks.AccountID equals accounts.AccountID
                join users in context.RBSUsers on accounts.UserID equals users.UserID
                where
                    users.UserID == user.UserID &&
                    reviewers.FullyQualifiedLogin == fullyQualifiedLogin &&
                    reviews.ReviewStatusID == (byte)Enums.ReviewStatus.InProgress &&
                    reviewitems.ReviewItemStatusID == (byte)Enums.ReviewItemStatus.Unapproved
                select reviewitems);

    byte colour = (byte)Enums.UserStatusColour.Red;
    if (u.Count() == 0)
    {
        colour = (byte)Enums.UserStatusColour.Green;
        countOfGreenUsers++;
    }
}

尝试创建匿名类型,但这不会编译。

// select number of green users
var x = from user in listOfUsersForReviewer
        from reviewitems in context.ReviewItems
        join groupaccountlinks in context.GroupAccountLinks on reviewitems.GroupAccountID equals
            groupaccountlinks.GroupAccountID
        join reviews in context.Reviews on reviewitems.ReviewID equals reviews.ReviewID
        join applications in context.Applications on reviews.ApplicationID equals applications.ApplicationID
        join reviewers in context.Reviewers on applications.ResponsibleReviewerID equals
            reviewers.ReviewerID
        join accounts in context.Accounts on groupaccountlinks.AccountID equals accounts.AccountID
        join users in context.RBSUsers on accounts.UserID equals users.UserID
        where
            users.UserID == user.UserID &&
            reviewers.FullyQualifiedLogin == fullyQualifiedLogin &&
            reviews.ReviewStatusID == (byte)Enums.ReviewStatus.InProgress &&
            reviewitems.ReviewItemStatusID == (byte)Enums.ReviewItemStatus.Unapproved
        select new
            {
                UserID = user.UserID,
                CountOfGreen = reviewitems.Count()
            };

2 个答案:

答案 0 :(得分:0)

添加分组条款

var x = from user in listOfUsersForReviewer
        from reviewitems in context.ReviewItems
        join groupaccountlinks in context.GroupAccountLinks on reviewitems.GroupAccountID equals
            groupaccountlinks.GroupAccountID
        join reviews in context.Reviews on reviewitems.ReviewID equals reviews.ReviewID
        join applications in context.Applications on reviews.ApplicationID equals applications.ApplicationID
        join reviewers in context.Reviewers on applications.ResponsibleReviewerID equals
            reviewers.ReviewerID
        join accounts in context.Accounts on groupaccountlinks.AccountID equals accounts.AccountID
        join users in context.RBSUsers on accounts.UserID equals users.UserID
        where
            users.UserID == user.UserID &&
            reviewers.FullyQualifiedLogin == fullyQualifiedLogin &&
            reviews.ReviewStatusID == (byte)Enums.ReviewStatus.InProgress &&
            reviewitems.ReviewItemStatusID == (byte)Enums.ReviewItemStatus.Unapproved
        group user by user.UserID into grouping
        select new
            {
                UserID = grouping.Key,
                CountOfGreen = grouping.Count()
            };

答案 1 :(得分:0)

我最后重新思考逻辑并将此查询分成两个更简单的查询。

我使用的工具是:SQL Server Management Studio(图形表示),Linqer以及可能的Linqpad

用英语撰写查询有很多帮助。