使用linq / Entity Framework查询多对多关系。 CodeFirst

时间:2015-05-26 18:58:33

标签: c# linq entity-framework many-to-many

如何首先使用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; }.

感谢您的帮助。

6 个答案:

答案 0 :(得分:40)

你可以这样做:

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扩展方法(正如@Khaled指出的那样)从Categories而不是Articles开始查询:

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

这将生成内部联接,而不是EXIST Any扩展方法的产品。

答案 1 :(得分:7)

怎么样

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

这应该可以正常工作(生成正确的连接sql语句。)

答案 2 :(得分:3)

示例linq方法语法

int category_ID = 1;

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

答案 3 :(得分:2)

我刚刚遇到这个问题并且认为我发布了我找到的解决方案,这个问题对于任何绊倒此页面的人来说都是如此。这会产生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 :(得分:1)

如果您只想要包含所有关系的整个表格,可以尝试这样的事情:

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

答案 5 :(得分:0)

添加并查询联结表:

  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();