C# 通过在mysql到linq中获取每个组的最大x行加上所有行信息
不久前,我发现了一个方便的mysql查询,可以通过它获得每个组的前X。 这就是我的意思: 如果这是表格: rid id1 id2 id3 value 1 1 1 1 10 2 1 1 2 11 3 1 1 3 9 4 1 2 1 20 5 1 2 2 18 6 1 2 3 23 7 1 3 1 30 8 1 3 2 34 9 1 3 3 31 10 1 3 4 27 11 1 3 5 32 12 1 4 1 41 13 1 4 2 40 14 1 4 3 43 15 1 5 1 53 16 1 5 2 51 17 1 5 3 50 18 2 1 1 11 19 2 1 2 9 20 2 1 3 12 两个问题。 A在MySQL中,查询速度不是很快。运行包含3207394行的表需要一些时间。使用不同的查询可以得到相同的结果吗?我无法得到它。 B我怎样才能把这个翻译成linq?由于奇怪的where语句,我不知道如何将其翻译成linq 后来我又补充了这个问题 在MySQL中,我使用以下查询:C# 通过在mysql到linq中获取每个组的最大x行加上所有行信息,c#,mysql,linq,greatest-n-per-group,C#,Mysql,Linq,Greatest N Per Group,不久前,我发现了一个方便的mysql查询,可以通过它获得每个组的前X。 这就是我的意思: 如果这是表格: rid id1 id2 id3 value 1 1 1 1 10 2 1 1 2 11 3 1 1 3 9 4 1 2 1 20 5 1 2 2 18 6 1 2 3 23 7 1 3 1 30 8 1 3 2 34 9 1 3 3 31 10 1
SELECT *,COUNT(*) AS Counter FROM idsandvalue GROUP BY id1,id2;
要获得此结果,请执行以下操作:
rid id1 id2 id3 value
2 1 1 2 11
6 1 2 3 23
8 1 3 2 34
14 1 4 3 43
15 1 5 1 53
rid id1 id2 id3 value Counter
1 1 1 1 10 3
4 1 2 1 20 3
7 1 3 1 30 5
12 1 4 1 41 3
15 1 5 1 53 3
18 2 1 1 11 3
我也很难把这个翻译成Linq
额外信息太大,无法发表评论
嗨,约翰,谢谢你的快速回复。
使用此mysql查询
SELECT * FROM
(SELECT * FROM idsandvalue
WHERE id1=1 AND
(SELECT COUNT(*) FROM idsandvalue AS helper
WHERE helper.id1 = idsandvalue.id1
AND helper.id2= idsandvalue.id2
AND helper.value > idsandvalue.value
) < 1
)a
我尝试获取每个分组id1和id2的行,它们的值最大。这就是为什么在这种情况下,我会得到例如id为2的行。11是10、11和9中的最大值,其中id1=1和id2=1。这就是为什么我得到id为8的行,因为其中id1=1,id2=3,列值的最大值是34。如果我将查询更改为<2,则得到前两个。对于id2=1和id2=3,这将给出id为8和11的行。这更好解释吗?这是怎么解释的:
var takeRows = 2; // or whatever value you want
var q = from i in idsandvalue
group i by new { i.ID1, i.ID2 } into g
orderby g.Key.ID1, g.Key.ID2
select new { g.Key.ID1, g.Key.ID2, TopValues = g.OrderByDescending(i => i.Value).Take(takeRows) };
这是怎么回事
var takeRows = 2; // or whatever value you want
var q = from i in idsandvalue
group i by new { i.ID1, i.ID2 } into g
orderby g.Key.ID1, g.Key.ID2
select new { g.Key.ID1, g.Key.ID2, TopValues = g.OrderByDescending(i => i.Value).Take(takeRows) };
在SQL Server中重新创建表并对其运行查询,然后通过linqer转换查询:
from a in ((from idsandvalue in db.idsandvalue whereidsandvalue.id1 == 1 &&
(from helper in db.idsandvalue
where
helper.id1 == idsandvalue.id1 &&
helper.id2 == idsandvalue.id2 &&
helper.value > idsandvalue.value
select new {
helper
}).Count() < 1
select new {
idsandvalue
}))
选择新的{
a、 idsandvalue.rid,
a、 idsandvalue.id1,
a、 idsandvalue.id2,
a、 idsandvalue.id3,
a、 idsandvalue.value
}在SQL Server中重新创建表并对其运行查询,然后通过linqer转换查询:
from a in ((from idsandvalue in db.idsandvalue whereidsandvalue.id1 == 1 &&
(from helper in db.idsandvalue
where
helper.id1 == idsandvalue.id1 &&
helper.id2 == idsandvalue.id2 &&
helper.value > idsandvalue.value
select new {
helper
}).Count() < 1
select new {
idsandvalue
}))
选择新的{
a、 idsandvalue.rid,
a、 idsandvalue.id1,
a、 idsandvalue.id2,
a、 idsandvalue.id3,
a、 idsandvalue.value
}目前只有1个问题标记为每组最多n个+linq。似乎是这样这对我来说真的不管用。你在链接中给我的解决方案。尊敬的Matthijs你还没有描述你想做什么。你说你想得到一个特定的结果,但你没有用语言描述这实际上意味着什么。我的SQL不够好,无法将该查询转换为正确的概念,即使从这些概念中,我很可能能够给出正确的LINQ查询……嗨,John,请查看编辑后的问题。再次感谢您的快速回答,目前只有1个问题被标记为“每组最多n个”+linq。似乎是这样这对我来说真的不管用。你在链接中给我的解决方案。尊敬的Matthijs你还没有描述你想做什么。你说你想得到一个特定的结果,但你没有用语言描述这实际上意味着什么。我的SQL不够好,无法将该查询转换为正确的概念,即使从这些概念中,我很可能能够给出正确的LINQ查询……嗨,John,请查看编辑后的问题。再次感谢您的快速响应您确定MySql linq provider在您的代码中支持组和其他功能吗?@SaeedAmiri-我甚至没有想到它不会@SaeedAmiri-我通常使用MS SQL,因此这是我的参考框架。如果MySql不能进行分组,我会非常震惊…谢谢。明天我将尝试一下。我现在没有代码。我收到以下错误消息:参数类型“RSAnalyseDB.IDSandValue”与相应的成员类型“System.Collections.Generic.IEnumerable`1[RSAnalyseDB.IDSandValue]“我使用DBLinq作为linq提供程序您确定MySql linq提供程序在您的代码中支持组和其他功能吗?@SaeedAmiri-我甚至没有想到它不会@SaeedAmiri-我通常使用MS SQL,因此这是我的参考框架。如果MySql不能进行分组,我会非常震惊…谢谢。明天我将尝试一下。我现在没有代码。我收到错误消息:参数类型“RSAnalyseDB.IDSandValue”与相应的成员类型“System.Collections.Generic.IEnumerable`1[RSAnalyseDB.IDSandValue]”不匹配。我使用DBLinq作为linq提供程序DBLinq不喜欢同一个表上的联接以前存在此问题。但是如果我首先在一个列表中得到原始结果,并使用该列表作为源。它似乎工作得很好。thanksDBLinq不喜欢同一个表上的联接,以前有过这个问题。但是如果我首先在一个列表中得到原始结果,并使用该列表作为源。它似乎工作得很好。谢谢