C# 通过在mysql到linq中获取每个组的最大x行加上所有行信息

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

不久前,我发现了一个方便的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中,我使用以下查询:

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不喜欢同一个表上的联接,以前有过这个问题。但是如果我首先在一个列表中得到原始结果,并使用该列表作为源。它似乎工作得很好。谢谢