gpt4 book ai didi

asp.net-core - Entity Framework 核心-相当于IN子句

转载 作者:行者123 更新时间:2023-12-03 23:18:52 25 4
gpt4 key购买 nike

我想知道如何将此sql查询转换为 Entity Framework 查询。

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

如果我正在使用有值(value)的EntityFramework功能,并且在BlogPost上有一个名为Post的引用属性,那么我将在一个查询中执行以下操作。

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

如果我使用的是有值(value)的EntityFramework功能,并且我有一个名为Blogs中的Posts的集合属性,那么很多查询BlogPost表就被EntityFramework隐藏,从而使您从未真正与之交互它来自C#。

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

另一方面,如果EntityFramework公开了很多BlogPost表,那么您仍然可以从Blog开始,并使用正确配置的collection和reference属性来获取此类帖子。

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的EntityFramework和C#语言功能,例如 LINQ。将问题分解成几个组成部分,可以帮助您解决问题,并使研究变得更容易,从而能够执行更复杂的操作。单独学习和练习LINQ将有助于您更好地使用EntityFramework。

关于asp.net-core - Entity Framework 核心-相当于IN子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41266234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com