我有一些类建模访客用户帐户,其中包括访客的状态和访客的主持人:
public class GuestUser
{
public string LoginID {get; set;}
public List<GuestDetails> GuestDetailsList {get; set;}
}
public class GuestDetails
{
public GuestGroupUserState State {get; set;}
public GuestCreator GuestCreator {get; set;}
public GuestUser GuestUser {get; set;}
}
public class GuestCreator
{
public string CreatorLoginID {get; set;}
public List<GuestDetails> GuestDetailsList {get; set;}
}
public enum GuestGroupUserState
{
Unknown = 0,
Active = 1,
Locked = Active << 1,
Deleted = Locked << 1
}
我想查找不在GuestUsers
州内的给定GuestDetails
的所有GuestCreator gc
和相应的Deleted
。
到目前为止,我试过了
var guestUsers = gc.GuestDetailsList
.Where(gd => gd.State != GuestGroupUserState.Deleted)
.Select(gd => gd.GuestUser);
但这显然为我提供了所有GuestDetails
用户,也包括Deleted
州的用户。
接下来,我尝试了
var guestUsers = userRepo.GuestUsers
.Where(gu => gu.GuestDetails
.Any(gd => gd.State != GuestGroupUserState.Deleted && gd.GuestCreator.Equals(gc)));
但这又为我提供了GuestDetails
这些用户,包括Deleted
- 状态的用户。
有没有办法让所有GuestUser
处于非删除状态的GuestDetail
,对于这些用户,只能获取未删除的GuestDetail
?如果GuestUser
仅删除了详细信息,则根本不应出现在列表中。目前,我foreach()
{{}}通过我上面的代码段生成的用户列表,并从每位访客中删除不匹配的详细信息条目 - 这不是我认为最有效的方式。
答案 0 :(得分:2)
使用您当前的模型架构,您无法摆脱GuestUser
上GuestDetails
已删除的GuestDetailsList
。为了实现您的目标,您需要更改
public List<GuestDetails> GuestDetailsList {get; set;}
为:
public GuestDetails GuestDetails {get; set;}
。 GuestUser
和GuestDetails
之间存在一对一的关系,您不会遇到此类问题,并且可以通过以下方式获取正确的信息:
var guestUsers = gc.GuestDetailsList
.Where(g => g.State != GuestGroupUserState.Deleted)
.Select(g => g.GuestUser);
答案 1 :(得分:2)
这&#34;不可能&#34;从严格意义上说。你不能过滤&#34;儿童收藏品;你需要分配新的: -
var guestUsers = ...; // Wherever they're coming from
var filteredUsers = guestUsers
.Where(x => x.GuestDetails.Any(y => y.State != GuestGroupUserState.Deleted))
.Select(x => new GuestUser()
{
LoginId == x.LoginId,
GuestDetails == x.GuestDetails
.Where(y => y.State != GuestGroupUserState.Deleted)
.ToList()
});
或者您可能希望向GuestUser
对象添加属性: -
public List<GuestDetails> ActiveGuestDetailsList
{
get { return this.GuestDetailsList.Where(y => y.State != GuestGroupUserState.Deleted); }
}
如果你正在使用EF或类似的,你会想要对数据库进行过滤并投射到DTO上。