【问题标题】:How to build custom PLINQO query by multiple id's?如何通过多个 id 构建自定义 PLINQO 查询?
【发布时间】:2011-03-23 11:24:23
【问题描述】:

这是我的表结构

地点

  • PlaceId PK
  • 姓名
  • ...

地点类别

  • CatId PK
  • 姓名
  • ...

地方猫

  • PlaceId PK
  • CatId 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);

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

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

我怎样才能从根本上合并这两个查询,让我通过 CatId 的 List&lt;int&gt; 进行查询?这个 LINQ/PLINQO 查询正在融化我的大脑。提前致谢!

【问题讨论】:

    标签: sql linq plinqo


    【解决方案1】:

    你需要写一个这样的扩展方法:

        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 支持)

    【讨论】:

    • 是的,PlaceCats 是连接表。我下载了最新的 PLINQO 模板并重新生成了代码。多对多关系就在那里。我针对这种情况提出了这个问题:假设 PlaceCats 表没有将父类别连接到地点的条目,我需要列出父类别的每个子类别中的地点。
    • 我已经改变了我的设计,我也会简单地将父类别分配给 PlaceCats 表中的位置......不需要查询。但我真的很感谢快速响应,我仍然会将此查询放入我的代码中以供以后使用。非常感谢。
    猜你喜欢
    • 2016-12-26
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2017-09-30
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    相关资源
    最近更新 更多