gpt4 book ai didi

c# - 嵌套 MySQL 查询的解决方法?

转载 作者:行者123 更新时间:2023-11-29 00:06:04 25 4
gpt4 key购买 nike

以下代码是伪代码——数据库结构没有任何问题。我正在使用数据库优先方法,事实证明它们工作正常。

考虑下表;

public class Blog
{
public int Id { get; set; }
public string Content { get; set; }
public ICollection<Post> Posts { get; set; }
}

public class Post
{
public string UserName { get; set; }
public int BlogId { get; set; }
public string Content { get; set; }
public virtual Blog Blog { get; set; }
}

然后说我想捕获所有 Blogs其中用户发布了两次(或更多次)。考虑 MyDbContextDbContext , 我会这样做;

using(var context = new MyDbContext)
{
var doublePosters = context.Blog.Where(b => b.Posts.GroupBy(p => p.UserName).Any(x => x.Count() > 1));
foreach(var poster in doublePosters)
{
//Do things with it
}
}

反过来,由于我使用的是 EF6 和 MySQL 数据库,IQueryable<>看起来像这样;

SELECT `Extent1`.`Id`, `Extent1`.`Content` 
FROM `Blog` AS `Extent1`
WHERE EXISTS
(
SELECT 1 AS `C1`
FROM
(
SELECT
`Extent2`.`UserName` AS `K1`, COUNT(1) AS `A1`
FROM `Post` AS `Extent2`
WHERE `Extent1`.`Id` = `Extent2`.`BlogId`
GROUP BY `Extent2`.`UserName`
) AS `GroupBy1`
WHERE `GroupBy1`.`A1` > 1
)

但是,MySQL 在返回时处理得不好

SQL Error (1054): Unknown column 'Extent1.Id' in 'where clause'

我已经认为这是 MySQL 的限制,因此我的问题是如何在不重击数据库的情况下获得相同的结果?

当然,一个选项是查询整个 Blog表,把它放在一个List<>让 LINQ 完成剩下的工作。然而,我的Blog表由大约 500000 条记录组成 - 获取所有它们不是一个好主意。

编辑

一些样本数据和预期数据;

博客:

+----+---------+
| Id | Content |
+----+---------+
| 1 | "blabla"|
| 2 | "albalb"|
+----+---------+

帖子:

+--------+----------+---------+
| BlogId | UserName | Content |
+--------+----------+---------+
| 1 | Jon | "Nice!" |
| 1 | Jon | "Well.."|
| 1 | Jon | "Nvm." |
| 1 | Sam | "Ok!" |
| 1 | Sam | "Good." |
| 1 | Robert | "Sweet" |
| 2 | Robert | "Nah" |
| 2 | Jonah | "Hey" |
+--------+----------+---------+

查询的预期输出:

+----+---------+
| Id | Content |
+----+---------+
| 1 | "blabla"|
+----+---------+

因为只有Blog 1 有张贴了多次的海报(看着你,Jon 和 Sam)。

最佳答案

这种方法怎么样(将查询分成两部分)?

var posts= context.Posts.GroupBy(p => p.UserName).Any(x => x.Count() > 1).Select(y=>y.BlogId).ToList(); 
var doublePosters = context.Blog.Where(b=> posts.Contains(b.Id));
foreach(var poster in doublePosters) {
//Do things with it
}

我不确定这种方法的性能(代码未测试),也许它可以作为解决问题的新方法的起点。

我的建议是

  1. 获取某人多次发布的博客的所有 id。
  2. 按先前查询的 ID 过滤博客

更新

试试这个代码来实现你的目标

var postIds = context.Posts.GroupBy(p => new {p.BlogId,p.UserName}).Where(x=> x.Count() > 1).Select(el=> el.Key.BlogId);
var doublePosters = context.Blog.Where(b => postIds.Contains(b.Id)).ToList();

关键是按 BlogId 和 UserName 分组

关于c# - 嵌套 MySQL 查询的解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27418465/

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