Как на LINQ (EF) получить список публикаций для заданных категорий и тегов?

Есть база примерно такой структуры:

CREATE TABLE [dbo].[Categories] (
	[CategoryId] int IDENTITY (1, 1) PRIMARY KEY,
	[Name] nvarchar(50),
	CONSTRAINT [CU_Categories_Name] UNIQUE ([Name])
) ON [PRIMARY]
	
CREATE TABLE [dbo].[Tags] (
	[TagId] int IDENTITY (1, 1) PRIMARY KEY,
	[Name] nvarchar(50),
	CONSTRAINT [CU_Tags_Name] UNIQUE ([Name])	
) ON [PRIMARY]

CREATE TABLE [dbo].[Pubs] (
	[PubId] int IDENTITY (1, 1) PRIMARY KEY,
	[Date] datetime,
	[Title] nvarchar(400),
	[Content] ntext,	
) ON [PRIMARY]

CREATE TABLE [dbo].[PubCategories] (
	[PubCategoryId] int IDENTITY (1, 1) PRIMARY KEY,
	[PubPtr] int,
	[CategoryPtr] int,
) ON [PRIMARY]
	
CREATE TABLE [dbo].[PubTags] (
	[PubTagId] int IDENTITY (1, 1) PRIMARY KEY,
	[PubPtr] int,
	[TagPtr] int,
) ON [PRIMARY]

ALTER TABLE [PubCategories] WITH CHECK ADD FOREIGN KEY ([PubPtr]) REFERENCES [Pubs] ([PubId]) ON DELETE NO ACTION
ALTER TABLE [PubCategories] WITH CHECK ADD FOREIGN KEY ([CategoryPtr]) REFERENCES [Categories] ([CategoryId]) ON DELETE NO ACTION
ALTER TABLE [PubTags] WITH CHECK ADD FOREIGN KEY ([PubPtr]) REFERENCES [Pubs] ([PubId]) ON DELETE NO ACTION
ALTER TABLE [PubTags] WITH CHECK ADD FOREIGN KEY ([TagPtr]) REFERENCES [Tags] ([TagId]) ON DELETE NO ACTION


Каким образом можно получить публикации для набора определенных категорий и тегов?

То есть: если я запрашиваю публикации для категории «Наука» и «Сотрудничество» содержащие теги «Достижения» и «Зарубежные связи» (категорий и тегов, в запросе, может быть указано несколько, а может и не быть сообще), то должны вернуться все публикации, которые подписаны на данные категории и теги.

В общем то, это типичная задача блогостроения, но не могу понять, как ее решить.
  • Вопрос задан
  • 230 просмотров
Решения вопроса 1
@NSpartak
Если ещё не нашёл ответ, то как вариант:
List<int> cataegoryIDs= ... // коды обязательных категорий
List<int> tagIDs= ... // коды обязательных тегов
var pubs = ctx.Pubs.Where(p => p.Categories.All(c => categoryIDs.Contains(c.ID)) && p.Tags.All(t => tagIDs.Contains(t.ID)));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы