Подтвердить что ты не робот

Запросить отношение "многие ко многим" с linq/Entity Framework. CodeFirst

Как я могу запросить отношения "многие ко многим", используя сначала код Entity Framework и linq? Проблема в том, что EF автоматически создает таблицу отношений. Итак, у меня его нет в моем контексте.

Это реляционная модель:

enter image description here

Мне нужен список статей для определенной Category_Id, в основном повторяйте что-то вроде этого:

select a.Id, a.Title,a.ShortDescription                       
from Articles a
join CategoryArticles ca on ca.Article_Id=a.Id
where ca.Category_Id  = @parameter

Однако мой dbcontext имеет только:

public DbSet<Article> Articles { get; set; }
public DbSet<Category> Categories { get; set; }.

Спасибо за любую помощь.

4b9b3361

Ответ 1

Вы можете сделать это:

var cat_id=1; // Change this variable for your real cat_id

var query= from article in db.Articles
           where article.Categories.Any(c=>c.Category_ID==cat_id)
           select article;

Таким образом, вы получите статьи, которые удовлетворяют условию, которое вы хотите. Это SQL-код, сгенерированный этим запросом:

    SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Title] AS [Title]
    FROM [dbo].[Articles] AS [Extent1]
    WHERE  EXISTS (SELECT 
        1 AS [C1]
        FROM [dbo].[ArticleCategories] AS [Extent2]
        WHERE ([Extent1].[Id] = [Extent2].[Article_Id]) AND ([Extent2].[Category_Id] = @p__linq__0))

Обновить

Другим вариантом может быть использование SelectMany расширения SelectMany (как указывало @Khaled), начиная запрос с Categories вместо Articles:

var query= db.Categories.Where(c=>c.Category_ID==cat_id).SelectMany(c=>Articles);

Это создаст Внутреннее соединение вместо EXIST который является продуктом Any метода расширения.

Ответ 2

Как насчет

db.Categories.Where(c => c.Id == categoryId).SelectMany(c => c.Articles)?

Это должно работать нормально (создайте правильную связанную инструкцию sql.)

Ответ 3

Я просто столкнулся с этим и решил, что отправлю решение, которое я нашел, для тех, кто спотыкался по этой странице. Это создает INNER JOIN.

var category_id = 24;

var query = (from article in Articles
             from category in article.Categories.Where(x => x.Category_ID == category_id)
             select article);

Ответ 4

Если вы просто хотите, чтобы вся таблица включала все отношения, возможно, попробуйте что-то вроде этого:

List<CategoryArticle> rec = context.Category.SelectMany(a => a.Articles.Select(c => new CategoryArticle { Category_Id = c.Id, Article_Id = a.Id })).ToList();

Ответ 5

Пример синтаксиса метода linq

int category_ID = 1;

var query = db.Articles
    .Where(a => a.Categories
    .Any(c => c.Category_ID == category_ID))
    .ToList();

Ответ 6

Добавьте и запросите таблицу соединений:

  var articles = (from ca in _context.CategoryArticles
                  inner join a in _context.Articles on a.Id equals ca.Article_Id
                  inner join c in _context.Catgories on c.Id equals ca.Category_Id
                  where ca.Category_Id equals catId
                  select c).ToList();