0

这是我的表结构

地方

  • PlaceId PK
  • 姓名
  • ...

地点类别

  • 货号 PK
  • 姓名
  • ...

地方猫

  • PlaceId PK
  • 货号 PK

这是我的查询,它根据类别 id(表连接)提取 Places

public static IQueryable<Places> ByPlaceCat(this Table<Places> table, Expression<Func<PlaceCats, bool>> predicate) {
    var db = (DataContext)table.Context;
    var innerBizBase = db.PlaceCats.Where(predicate);
    return db.Places.Join(innerBizBase, a => a.PlaceId, ab => ab.PlaceId, (a, ab) => a);
}

我这样使用它:

places = Db.Places.ByPlaceCat(a => a.CatId == 5);

但我希望能够根据List<int>类别 id 进行拉取。查看生成的 PLINQO 代码,由多个 PlaceId(但不使用连接表)提取的查询如下所示:

public static IQueryable<Places> ByPlaceId(this IQueryable<Places> queryable, IEnumerable<long> values)
{
    return queryable.Where(p => values.Contains(p.PlaceId));
}

我怎样才能从本质上合并这两个查询,让我传入一个List<int>CatId 进行查询?这个 LINQ/PLINQO 查询正在融化我的大脑。提前致谢!

4

1 回答 1

3

您需要编写这样的扩展方法:

    public static IQueryable<Places> ByPlaceCats(this Table<Places> table, IEnumerable<int> catIds)
    {
        var db = (TestDataContext)table.Context;
        var places = (from placeCat in db.PlaceCats
                      join place in db.Places on placeCat.PlaceId equals place.PlaceId
                      where catIds.Contains(placeCat.CatId)
                      select place);
        return places;
    }

请注意,可以通过将两个外键添加到正确的表中,将 PlaceCats 表变成多对多关系。一旦进行了此更改,PLINQO将自动生成正确的代码,并在两个表之间创建一个链接,从而跳过中间表。因此,您可以通过访问 Places 实体上的属性来获取与当前 Places 实体关联的 PlaceCategories 集合。

如果您有任何问题,请记得与我们联系,并务必查看此处的社区论坛和此处的PLINQO 论坛

谢谢 -Blake Niemyjski(CodeSmith 支持)

于 2011-03-23T18:04:23.430 回答