C#Linq在返回父级时过滤并删除子集合上的记录

时间:2017-08-21 23:17:09

标签: c# entity-framework linq

我有以下型号:

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!

1 个答案:

答案 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之间建立了一对多关系。由于ChildrenChild的非标准复数,可能需要一些流畅的API或属性,但这不属于这个问题的范围。

顺便问一下,您是否注意到我将您的列表更改为ICollection?我还没有对它进行过测试,但我确信实体框架在列表中无法正常工作。我想知道如果您查询以下内容会发生什么:

Children

正确建模一对多后,您的查询将很简单:

Child thirdChild = Parent.children[3];

用语言说:

来自Parent集合中的每个父级,使用父级的Id和Name创建一个anonymous type的对象,以及一组未删除的子级。从生成的集合中,仅获取具有至少一个子项的子集合的对象。