过滤子列表记录以及父列表字段

Posted

技术标签:

【中文标题】过滤子列表记录以及父列表字段【英文标题】: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));

【问题讨论】:

什么版本的 EF?你试过什么?你读过这个:docs.microsoft.com/en-us/ef/core/querying/related-data/… 吗? 目前我没有使用实体框架,我想过滤硬编码列表。 最好在这样的问题中包含所需输出的示例。 【参考方案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/…

以上是关于过滤子列表记录以及父列表字段的主要内容,如果未能解决你的问题,请参考以下文章

访问下拉列表以过滤子表单

如何过滤列表视图中的内部子元素以及使用 Jquery 在移动应用程序中将字母滚动条添加到列表视图的任何简单方法

如何使用谓词过滤子实体集合?

Django 多对多字段过滤器列表

难以为父对象和子对象的构造函数传递初始化列表

C#合并来自父级对象列表的子对象列表