【问题标题】:Filter sublist record/s along with parent list field过滤子列表记录以及父列表字段
【发布时间】:2021-10-14 22:59:06
【问题描述】:

我想过滤具有ModelLogin.LoginDate = dateTimeTodayModelLoginRecords.LoginPurpose = "Update" 的记录。

结果必须是一个 ModelLogin 列表,它的 LoginDate(dateTimeToday)LoginRecords 子列表只有 "Update"

模型 1

public class ModelLogin
{
    public DateTime LoginDate;
    public List<ModelLoginRecords> LoginRecords;

    public ModelLogin(DateTime LoginDate, List<ModelLoginRecords> LoginRecords)
    {
        this.LoginDate = LoginDate;
        this.LoginRecords = LoginRecords;
    }
}

模型 2

public class ModelLoginRecords
{
    public string UserName;
    public string LoginPurpose;

    public ModelLoginRecords(string UserName, string LoginPurpose)
    {
        this.UserName = UserName;
        this.LoginPurpose = LoginPurpose;
    }
}

样本数据

        List<ModelLogin> listLogins = new List<ModelLogin>();

        List<ModelLoginRecords> loginRecordsList = new List<ModelLoginRecords>();
        loginRecordsList.Add(new ModelLoginRecords("Alex", "Update"));
        loginRecordsList.Add(new ModelLoginRecords("David", "Update"));
        loginRecordsList.Add(new ModelLoginRecords("Jason", "Remove"));
        listLogins.Add(new ModelLogin(dateTimeToday, loginRecordsList));

        loginRecordsList = new List<ModelLoginRecords>();
        loginRecordsList.Add(new ModelLoginRecords("Kate", "Update"));
        loginRecordsList.Add(new ModelLoginRecords("William", "Remove"));
        listLogins.Add(new ModelLogin(dateTimeYesterday, loginRecordsList));

【问题讨论】:

标签: c# .net list linq data-filtering


【解决方案1】:

请检查下面的代码。

public class Test
{
    [Fact]
    public void test()
    {
        //arrange
        var updatePurpose = "Update";
        var removePurpose = "Remove";

        List<ModelLogin> listLogins = new();
        var dateTimeToday = DateTime.Today;
        var dateTimeYesterday = dateTimeToday.AddDays(-1);

        List<ModelLoginRecords> loginRecordsList = new();

        loginRecordsList.Add(new ModelLoginRecords("Alex", updatePurpose));
        loginRecordsList.Add(new ModelLoginRecords("David", updatePurpose));
        loginRecordsList.Add(new ModelLoginRecords("Jason", removePurpose));
        listLogins.Add(new ModelLogin(dateTimeToday, loginRecordsList));

        loginRecordsList = new List<ModelLoginRecords>
        {
            new ModelLoginRecords("Kate", updatePurpose),
            new ModelLoginRecords("William", removePurpose)
        };
        listLogins.Add(new ModelLogin(dateTimeYesterday, loginRecordsList));

        //act
        var loginModelsWithUpdatePurpose = listLogins.Where(listLogin =>
            listLogin.LoginDate.Date == dateTimeToday.Date &&
            listLogin.LoginRecords.Any(i => i.LoginPurpose == updatePurpose)
        ).Select(i =>
            new ModelLogin(
                i.LoginDate,
                i.LoginRecords.Where(j => j.LoginPurpose == updatePurpose).ToList()
            )
        ).ToList();

        //assert
        foreach (var loginModel in loginModelsWithUpdatePurpose)
            Assert.DoesNotContain(loginModel.LoginRecords, i => i.LoginPurpose != updatePurpose);
    }
}

public class ModelLoginRecords
{
    public string UserName { get; private set; }
    public string LoginPurpose { get; private set; }

    public ModelLoginRecords(string userName, string loginPurpose)
    {
        UserName = userName;
        LoginPurpose = loginPurpose;
    }
}

public class ModelLogin
{
    public DateTime LoginDate { get; private set; }
    public IEnumerable<ModelLoginRecords> LoginRecords { get; private set; }

    public ModelLogin(DateTime loginDate, IEnumerable<ModelLoginRecords> loginRecords)
    {
        LoginDate = loginDate;
        LoginRecords = loginRecords;
    }
}

【讨论】:

  • 这是我面临的同一个问题。使用 .LoginRecords.Any 时返回列表而不排除 removePurpose。如果子子项包含 updatePurpose 并且其父项也包含 removePurpose 则获取所有捆绑包。
  • 任何检查子列表是否包含 updatePurpose; if contains 返回整个父列表而不排除 removePurpose
  • @AlexanderRaymak 我已经更新了我的答案,我建议您阅读有关 LINQ 的更多信息docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 2023-03-30
  • 2015-09-03
相关资源
最近更新 更多