0

问题:我试图在 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()
            };
4

2 回答 2

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()
            };
于 2013-01-10T18:41:55.913 回答
0

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

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

用英语编写查询很有帮助。

于 2013-01-11T16:56:21.323 回答