Linq All有条件

时间:2013-05-23 16:26:34

标签: linq entity-framework

DB:

enter image description here

我试图仅在ReviewItems的All满足ReviewItemStatus == 3的条件时才返回数据。这有效。

问题:但是我希望将All的范围缩小到所有ReviewIID,其中ReviewerID == 1000

 // I want ALL groupAccountLinks only for ReviewerID==1000 and AccountID
// 0)  (and thus ReviewItems) for Account Charlie have ReviewItemStatusID==3
var xx = Accounts.Where(acc => acc.GroupAccountLinks.All(gal => 
                        // do ANY of the (1) associated reviewItems contain ri.ReviewItemStatusID == 3
                        gal.ReviewItems.Any(ri => ri.ReviewItemStatusID == 3)
                        // This doesn't work
                        //&& ri.Review.ReviewerID == 1000
                     )
&& acc.AccountID == 1002 // Charlie

);

将针对EF4.1正在使用Linqpad和LinqToSQL测试db。

进行测试

3 个答案:

答案 0 :(得分:0)

你有&&条件。所以,我认为你的表没有AccountId = 1002而且所有ReviewItemStatusID = 3。所以改变&&条件到||条件。

答案 1 :(得分:0)

我要做的第一件事就是关闭&& acc.AccountID == 1002并确保您获得状态为3 Accounts的整个未经过滤的ReviewItem。如果看起来不错,请尝试以这种方式进行过滤:

        var xx = Accounts
                  .Where(acc => acc.GroupAccountLinks
                                   .All(gal => gal.ReviewItems
                                          .Any(ri => ri.ReviewItemStatusID == 3))
                         .FirstOrDefault(acc => acc.AccountID == 1002);

答案 2 :(得分:0)

感谢Jesse,Slauma和RemeshRams带领我这样做:

var xxx = Accounts.Where(
        // do All Accounts satisfy condition
        u => u.Accounts.All(
                        // do All GroupAccountLinks (and thus ReviewItems) for Account meet the condition of ReviewItemStatusID==3
                        acc => acc.GroupAccountLinks.All(
                                                        // for ReviewItems where ReviewerID==1000, do they All have ReviewItemStatusID==3 
                                                        gal => gal.ReviewItems.Where(
                                                                                    ri => ri.Review.ReviewerID == 1000)
                                                                                .All(
                                                                                    ri => ri.ReviewItemStatusID == 3
                                                                                            )
                                                                // Make sure there are some ReviewItems
                                                                && gal.ReviewItems.Any()
                                                        )
                        )
            );