【发布时间】:2014-12-11 18:36:29
【问题描述】:
以下代码是伪代码——数据库结构没有任何问题。我正在使用数据库优先方法,并且它们已经证明可以正常工作。
考虑以下表格;
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。
考虑到MyDbContext 是DbContext,我会这样做;
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 错误 (1054):“where 子句”中的未知列“Extent1.Id”
我已经认为这是 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 有张贴了多次的海报(看着你,乔恩和山姆)。
【问题讨论】:
-
您能否分享一些示例数据以及该示例数据的预期输出?
-
@AbhikChakraborty 已更新。
-
我已经更新了我的答案,如果它满足你的需要,请告诉我
标签: c# mysql entity-framework