我想知道如何将此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.