我有以下型号:
Parent Child
------------- -----
int id; int id;
string name; string name;
List<Child> children; bool isDeleted;
我正在使用EF,我希望通过不删除子项的父ID获取父子集合。
我尝试了以下内容:
var parentRepo = repoFactory.Get<ParentRepo>();
var parent = parentRepo.where(x => x.id == parentId && x.children.All(y => !y.isDeleted));
但这不起作用。我也尝试了以下工作:
var parentRepo = repoFactory.Get<ParentRepo>();
var parent = parentRepo.where(x => x.id == parentId);
.Select(x => new { id = x.id, name = x.name, children = x.children.Where(y=> !y.isDeleted).ToList() }).ToList()
.Select(y => new Parent { id = y.id, name = y.name, children = y.children }).ToList();
但是我正在使用的课程相当大,我不确定这样填写每个属性是否是一个好习惯,如果我要添加新属性,将来可能会遗漏一些。
是否有另一个过滤掉内部集合,同时保持外部(父)一个? Thnaks!
答案 0 :(得分:0)
我希望通过父ID在子项中获取父子集合 未删除。
这有点不清楚,但我认为这意味着您希望收集那些至少有一个var path = @"C:\Users\admin\Desktop\test.txt";
List<string> list = File.ReadAllLines(path).ToList();
list.Sort();
for (var i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]);
}
未被删除的Parents
,以及所有未删除的子项。
这也可能意味着您只希望Child
没有删除Parents
。在这种情况下,查询将是类似的。
如果您根据规则对实体框架one-to-many relationship建模,这很容易。
Children
通常情况下,这足以告知实体框架您在class Parent
{
public int Id {get; set;}
// a Parent has zero or more Children:
public virtual ICollection<Child> Children {get; set;}
...
}
public class Child
{
public int Id {get; set;}
// a Child belongs to exactly one Parent, via foreign key ParentId:
public int ParentId {get; set;}
public virtual Parent Parent {get; set;}
}
和Parent
之间建立了一对多关系。由于Children
到Child
的非标准复数,可能需要一些流畅的API或属性,但这不属于这个问题的范围。
顺便问一下,您是否注意到我将您的列表更改为ICollection?我还没有对它进行过测试,但我确信实体框架在列表中无法正常工作。我想知道如果您查询以下内容会发生什么:
Children
正确建模一对多后,您的查询将很简单:
Child thirdChild = Parent.children[3];
用语言说:
来自Parent集合中的每个父级,使用父级的Id和Name创建一个anonymous type的对象,以及一组未删除的子级。从生成的集合中,仅获取具有至少一个子项的子集合的对象。