我无法创建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。怎么做?
答案 0 :(得分: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 =“级别2”。
请注意,如果我实际上在这里,这看起来像一个巨大的混乱和更大的黑客。我倾向于将逻辑移到存储过程或尝试将其简化为数据模型中的其他位置。
注2,我也尽职尽责地忽略了您的评论代码。
注3,如果我知道您的数据模型和查询背后的推理,我确信有更好的方法。