使用 linq/Entity 框架查询多对多关系。代码优先
Query a many-to-many relationship with linq/Entity Framework. CodeFirst
如何使用 Entity Framework code first 和 linq 查询多对多关系?问题是 EF 自动创建关系 table。所以,我的上下文中没有它。
这是关系模型:
我需要特定 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; }.
感谢您的帮助。
你可以这样做:
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
扩展方法的产物。
怎么样
db.Categories.Where(c => c.Id == categoryId).SelectMany(c => c.Articles)?
这应该可以正常工作(生成正确的连接 sql 语句。)
我只是 运行 了解了这一点,并认为我会 post 我找到的解决方案,供任何绊倒此页面的人使用。这会产生一个 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);
如果您只想要整个 table 包括所有关系,也许可以尝试这样的事情:
List<CategoryArticle> rec = context.Category.SelectMany(a => a.Articles.Select(c => new CategoryArticle { Category_Id = c.Id, Article_Id = a.Id })).ToList();
示例 linq 方法语法
int category_ID = 1;
var query = db.Articles
.Where(a => a.Categories
.Any(c => c.Category_ID == category_ID))
.ToList();
添加和查询路口table:
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();
如何使用 Entity Framework code first 和 linq 查询多对多关系?问题是 EF 自动创建关系 table。所以,我的上下文中没有它。
这是关系模型:
我需要特定 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; }.
感谢您的帮助。
你可以这样做:
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
扩展方法的产物。
怎么样
db.Categories.Where(c => c.Id == categoryId).SelectMany(c => c.Articles)?
这应该可以正常工作(生成正确的连接 sql 语句。)
我只是 运行 了解了这一点,并认为我会 post 我找到的解决方案,供任何绊倒此页面的人使用。这会产生一个 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);
如果您只想要整个 table 包括所有关系,也许可以尝试这样的事情:
List<CategoryArticle> rec = context.Category.SelectMany(a => a.Articles.Select(c => new CategoryArticle { Category_Id = c.Id, Article_Id = a.Id })).ToList();
示例 linq 方法语法
int category_ID = 1;
var query = db.Articles
.Where(a => a.Categories
.Any(c => c.Category_ID == category_ID))
.ToList();
添加和查询路口table:
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();