如何通过多个id构建自定义PLINQO查询?

时间:2011-03-23 11:24:23

标签: sql linq plinqo

这是我的表结构

地方

  • PlaceId PK
  • 名称
  • ...

PlaceCategories

  • CatId PK
  • 名称
  • ...

PlaceCats

  • PlaceId PK
  • CatId PK

这是我的查询,它根据类别ID(表格连接)

来提取地方信息
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查询正在融化我的大脑。提前谢谢!

1 个答案:

答案 0 :(得分: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表转换为ManyToMany relationship。完成此更改后,PLINQO将自动生成正确的代码,并将在跳过中间表的两个表之间创建链接。因此,您可以通过访问Places实体上的属性来获取与当前Places实体关联的PlaceCategories集合。

如果您有任何疑问,请务必联系contact us,并确保查看位于herePLINQO forums here的社区论坛。

由于 -Blake Niemyjski(CodeSmith支持)