内部连接内部扩展方法(linq)

时间:2009-04-17 19:00:07

标签: c# linq extension-methods

我正在尝试为存储库编写扩展方法。存储库有一个方法IQueryable<parent> GetAll()。我想创建一个扩展方法FilterByChildId(int childId),以便我可以写:

List<parent> data = from d in repository.getAll().FilterByChildId(33).ToList()

不确定如何在扩展方法中对父级和子级进行连接。 我觉得它会是这样的:

public static IQueryable<parent> FilterByChildId(
  this IQueryable<parent> query, 
  int id)
{
  return from data in query where data.child.id == id select data
}

但不是机会。我尝试了使用join,groupjoin但不点击的各种变体。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

我基本上和你一样写。

public static IQueryable<Parent> FilterByChildId(
   this IQueryable<Parent> parents, Int32 id)
{
   return parents.Where(p => p.Child.Id == id);
}

只需使用我的一个Entity Framework模型进行检查即可。我假设一个简单的多(父)到一(子)关系,如代码所示。请注意,这有点令人困惑 - 许多父母为一个孩子。可能是你有多对多关系吗?一个父母可能有很多孩子,一个孩子可能有多个父母?然后,代码中的Childschild)将成为一个集合,代码必须按如下方式进行更改。

public static IQueryable<Parent> FilterByChildId(
   this IQueryable<Parent> parents, Int32 id)
{
   return parents.Where(p => p.Childs.Any(c => c.Id == id));
}

第三个可能性是父母一方有很多孩子。第二种方法适用于这种情况,但假设子ID是唯一的,总是至少返回一个父级。