-2

我无法创建 LINQ 请求。我有一个基本要求:

        var result = from i in _dbContext.Users
                     where i.ID != CurrentUserID &&
                     //i.UserType.UserTypeID == (from a in _dbContext.UserTypes where a.UsersSelectMeetingCriteria.Any(p => p.ID == CurrentUserID) select a.UserTypeID).FirstOrDefault() &&
                     i.Services.Any(p => p.UsersSelectMeetingCriteria.Any(k => k.ID == CurrentUserID)) &&
                     i.GeographicalAreas.Any(p=>p.UsersSelectMeetingCriteria.Any(o=>o.ID == CurrentUserID)) &&
                     i.MultiplyItems.Any(r => (r.UsersSelectMeetingCriteria.Any(q => q.ID == CurrentUserID) && r.ItemType == MultiplyItemKeys.USER_TYPE)) &&
                     i.MultiplyItems.Any(s => (s.UsersSelectMeetingCriteria.Any(q => q.ID == CurrentUserID) && s.ItemType == MultiplyItemKeys.COMPANY_INVOLVED)
                     )

                     select new DataTable.UserModel()
                     { ... };

但我需要 4 级搜索。如果所有 4 个位置都可以,那么这是第一级用户,如果只有 3 个(但第 4 个不是)- 级别 #2,如果 2 - 是,2 - 否然后级别 #3,如果只有一个匹配 - 级别 #4。怎么做?

4

1 回答 1

1

未经测试,并且在黑暗中进行了相当疯狂的尝试,但这也许会为您指明正确的方向:

var result = from i in _dbContext.Users
             let check1 = i.Services.Any(p => p.UsersSelectMeetingCriteria.Any(k => k.ID == CurrentUserID))
             let check2 = i.GeographicalAreas.Any(p=>p.UsersSelectMeetingCriteria.Any(o=>o.ID == CurrentUserID))
             let check3 = i.MultiplyItems.Any(r => (r.UsersSelectMeetingCriteria.Any(q => q.ID == CurrentUserID) && r.ItemType == MultiplyItemKeys.USER_TYPE))
             let check4 = i.MultiplyItems.Any(s => (s.UsersSelectMeetingCriteria.Any(q => q.ID == CurrentUserID) && s.ItemType == MultiplyItemKeys.COMPANY_INVOLVED))
             let level = 5 - (check1 ? 1 : 0) - (check2 ? 1 : 0) - (check3 ? 1 : 0) - (check4 ? 1 : 0)
             where i.ID != CurrentUserID && level <= 4
             select new {i, level};                 

这样做是独立执行您的检查,然后从 5 中减去成功检查的数量。因此,如果三个成功而一个失败,您将拥有 5-3 = "level 2"。

请注意,如果我在这里实际上是在正确的轨道上,这看起来就像一个巨大的混乱和一个更大的黑客。我倾向于将逻辑移动到存储过程或尝试在数据模型的其他地方简化它。

注意 2,我也尽职尽责地忽略了您的注释代码。

注意 3,如果我知道您的数据模型和查询背后的推理,我确信有更好的方法来做到这一点。

于 2013-02-18T16:54:45.263 回答