web-dev-qa-db-ja.com

linq / Entity Frameworkを使用して多対多の関係を照会します。コードファースト

最初に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; }.

助けてくれてありがとう。

33
D.B

あなたはこれを行うことができます:

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の代わりに内部結合を生成します。

40
octavioccl

どう?

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

これは正常に動作するはずです(結合された正しいSQLステートメントを生成します)。

7
Khaled Rashad

Linqメソッドの構文の例

int category_ID = 1;

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

私はこれに偶然出会い、このページを偶然見つけた人のために見つけた解決策を投稿すると思いました。これにより、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);
2
JOpuckman

すべての関係を含むテーブル全体が必要な場合は、次のようなものを試してください。

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

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