Как создать собственный запрос PLINQO по нескольким идентификаторам?

Вот моя структура таблицы

места

  • PlaceId PK
  • название
  • ...

PlaceCategories

  • CatId PK
  • название
  • ...

PlaceCats

  • PlaceId PK
  • CatId PK

Вот мой запрос, который вытягивает места на основе идентификатора категории (объединение таблиц)

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 ответ

Решение

Вам нужно написать метод расширения, например:

    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, добавив два внешних ключа в соответствующие таблицы. После внесения этого изменения PLINQO автоматически сгенерирует правильный код и создаст ссылку между двумя таблицами, пропустив промежуточную таблицу. Таким образом, вы можете получить коллекцию PlaceCategories, связанную с текущей сущностью Places, путем доступа к свойству сущности Places.

Пожалуйста, не забудьте связаться с нами, если у вас есть какие-либо вопросы, и обязательно посетите форумы сообщества, расположенные здесь, и форумы PLINQO здесь.

Спасибо - Блейк Немийски (поддержка CodeSmith)

Другие вопросы по тегам