过滤集合内的集合

时间:2015-05-06 15:57:51

标签: c# linq

我有一些类建模访客用户帐户,其中包括访客的状态和访客的主持人:

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() {{}}通过我上面的代码段生成的用户列表,并从每位访客中删除不匹配的详细信息条目 - 这不是我认为最有效的方式。

2 个答案:

答案 0 :(得分:2)

使用您当前的模型架构,您无法摆脱GuestUserGuestDetails已删除的GuestDetailsList。为了实现您的目标,您需要更改

public List<GuestDetails> GuestDetailsList {get; set;}

为:

public GuestDetails GuestDetails {get; set;}

在GuestUser类上

GuestUserGuestDetails之间存在一对一的关系,您不会遇到此类问题,并且可以通过以下方式获取正确的信息:

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上。