加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-core – 实体框架核心 – 相当于IN子句

发布时间:2020-12-16 04:00:27 所属栏目:asp.Net 来源:网络整理
导读:我想知道如何将此SQL查询转换为实体框架查询. SELECT * FROM PostWHERE PostId IN (SELECT PostId FROM BlogPostWHERE BlogId = blogId); 我正在尝试获取具有给定类别ID的帖子列表. 数据库简化: 博客(帖子的类别): BlogIdTitle.. 帖子: PostIdTitle.. Blo
我想知道如何将此SQL查询转换为实体框架查询.
SELECT * 
FROM Post
WHERE PostId IN (
SELECT PostId FROM BlogPost
WHERE BlogId = &blogId);

我正在尝试获取具有给定类别ID的帖子列表.

数据库简化:

博客(帖子的类别):

BlogId
Title
..

帖子:

PostId
Title
..

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

先感谢您.

解决方法

以下是根据您提供的信息在一个查询中执行此操作的方法.
var posts = await _context.Post
    .Where(post =>
        _context.BlogPost.Any(bp => bp.BlogId == blogId && bp.PostId == post.PostId)
    )
    .ToListAsync();

以下是我将如何在两个查询中执行此操作,以便根据您提供的信息使用Contains.

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的引用属性.

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

如果我使用有价值的EntityFramework功能,并且我有一个名为Posts from Blog的集合属性,并且EntityFramework隐藏了许多BlogPost表,以至于您实际上从未与它来自C#.

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

另一方面,如果EntityFramework公开了许多BlogPost表,那么你仍然可以从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();

外卖,EntityFramework不是SQL.你在SQL中做什么可能会或可能不会直接映射,甚至适用于你在EntityFramework中如何进行映射.不仅如此,当您使用EntityFramework时,您使用的是EntityFramework和C#语言功能,而不是EntityFramework本身,例如LINQ.将问题分解为其组成部分可以帮助您解决问题,并使研究更容易进行更复杂的操作.单独学习和练习LINQ将帮助您更好地使用EntityFramework.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读