Entity Frameworkコア - IN節同等

asp.net-core entity-framework-core

質問

私はどのようにエンティティのフレームワークのクエリにこのSQLクエリを変換するのだろうか。

SELECT * 
FROM Post
WHERE PostId IN (
SELECT PostId FROM BlogPost
WHERE BlogId = &blogId);

私は与えられたカテゴリIDを持つ投稿のリストを取得しようとしています。

データベースの簡略化:

ブログ(投稿のカテゴリ):

BlogId
Title
..

役職:

PostId
Title
.. 

2つのテーブルを結合し、投稿ごとに複数のカテゴリがあるようにするためのBlogPost:

PostId
BlogId

これは私がすでに持っているものですが、もちろんクエリが機能していません:

public async Task<IActionResult> Category(int? id)
        {
            int blogId = id;

            if (blogId == null)
            {
                return NotFound();
            }
            ICollection<Post> posts = await _context.Post.Where(pid => pid.PostId.Contains(_context.BlogPost.Where(i => i.PostId == blogId).ToListAsync())).ToListAsync();

            if (posts == null)
            {
                return NotFound();
            }

            return View(posts );
        }

前もって感謝します。

受け入れられた回答

ここで私があなたが提供した情報に基づいて1つのクエリでそれを行う方法があります。

var posts = await _context.Post
    .Where(post =>
        _context.BlogPost.Any(bp => bp.BlogId == blogId && bp.PostId == post.PostId)
    )
    .ToListAsync();

ここでは、あなたが提供した情報に基づいてContainsを使用するために2つのクエリでそれを行う方法を示します。

var postIds = await _context.BlogPost
    .Where(bp => bp.BlogId = blogId)
    .Select(bp => bp.PostId)
    .ToArrayAsync();
var posts = await _context.Post
    .Where(p => postIds.Contains(p.PostId))
    .ToListAsync();

貴重なEntityFramework機能を使用していて、BlogPostにPostという名前の参照プロパティを持っていた場合、これをどのようにして1つのクエリで行うのですか?

var posts = await _context.BlogPost
    .Where(bp => bp.BlogId == blogId)
    .Select(bp => bp.Post)
    .ToListAsync();

ここでは、貴重なEntityFramework機能を使用していて、Blogsからの投稿という名前のコレクションプロパティがあり、多くのBlogPostテーブルがEntityFrameworkによって隠されていて、実際にはそれはC#からです。

var posts = await _context.Blog
    .Where(b => b.BlogId == blogId)
    .SelectMany(b => b.Posts)
    .ToListAsync();

一方、多くのBlogPostテーブルがEntityFrameworkによって公開されている場合でも、Blogから開始し、適切に設定されたコレクションと参照プロパティを使用してそのような投稿にアクセスできます。

var posts = await _context.Blog
    .Where(b => b.BlogId == blogId)
    .SelectMany(b => b.BlogPosts)
    .Select(bp => bp.Post)
    .ToListAsync();

または

var posts = await _context.Blog
    .Where(b => b.BlogId == blogId)
    .SelectMany(b => b.BlogPosts.Select(bp => bp.Post))
    .ToListAsync();

Takeover、EntityFrameworkはSQLではありません。 SQLで行うことは、直接マップすることも、マップしないこともあります。また、EntityFrameworkでどのように行うかにも適用できます。それだけでなく、EntityFrameworkを使用している場合、EntityFrameworkそれ自体ではないEntityFramework C#言語機能、 LINQなど使用しています。問題を構成部分に分解することで、問題を解決し、より複雑な操作を実行できるように勉強するのを容易にすることができます。孤立してLINQを勉強し、練習することは、EntityFrameworkでよりうまくいくのに役立ちます。


人気のある回答

LINQクエリ

from p in _context.Post
where _context.BlogCategory.Any
                ( bc => bc.PostId == p.PostId 
                  && bc.BlogId == &id
                )
select p;

SQL

SELECT * 
FROM Post
WHERE PostId IN (
SELECT PostId FROM BlogCategory
WHERE BlogId = &id);

または

SELECT * 
FROM Post p
WHERE EXISTS
    (
      SELECT 1 FROM BlogCategory
      WHERE PostId = p.PostID AND BlogId = &id
    );


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ