过滤子列表记录以及父列表字段
Posted
技术标签:
【中文标题】过滤子列表记录以及父列表字段【英文标题】:Filter sublist record/s along with parent list field 【发布时间】:2021-10-14 22:59:06 【问题描述】:我想过滤具有ModelLogin.LoginDate = dateTimeToday
和ModelLoginRecords.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/…以上是关于过滤子列表记录以及父列表字段的主要内容,如果未能解决你的问题,请参考以下文章