最初にEntity Frameworkコードとlinqを使用して多対多の関係を照会するにはどうすればよいですか?問題は、EFがリレーションテーブルを自動的に作成することです。だから、私はそれを自分のコンテキストに持っていません。
これはリレーショナルモデルです。
特定の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
の代わりにCategories
からクエリを開始するArticles
拡張メソッド(@Khaledが指摘)を使用することもできます。
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ステートメントを生成します)。
Linqメソッドの構文の例
int category_ID = 1;
var query = db.Articles
.Where(a => a.Categories
.Any(c => c.Category_ID == category_ID))
.ToList();
私はこれに偶然出会い、このページを偶然見つけた人のために見つけた解決策を投稿すると思いました。これにより、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);
すべての関係を含むテーブル全体が必要な場合は、次のようなものを試してください。
List<CategoryArticle> rec = context.Category.SelectMany(a => a.Articles.Select(c => new CategoryArticle { Category_Id = c.Id, Article_Id = a.Id })).ToList();
Junctionテーブルを追加して照会します。
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();