Как создать собственный запрос 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)