C# 根据sql中的ID分别获取行

C# 根据sql中的ID分别获取行,c#,sql,C#,Sql,我有一张桌子如下: TypeID Name Date ------------------------------- 1 Carrot 1-1-2013 1 Beetroot 1-1-2013 1 Beans 1-1-2013 2 cabbage 1-1-2013 2 potato 1-1-2013 2 tomato 1-1-2013 2 onio

我有一张桌子如下:

TypeID   Name         Date
-------------------------------
1        Carrot    1-1-2013
1        Beetroot  1-1-2013
1        Beans     1-1-2013
2        cabbage   1-1-2013
2        potato    1-1-2013
2        tomato    1-1-2013
2        onion     1-1-2013
如果需要2行,那么它应该从TypeId 1返回2行,从TypeId 2返回2行。如果只需要4行,意味着我必须从TypeId 1获得4行,从TypeId 2获得4行 但是TypeID1只有3行,所以我们只需要为TypeID1获取3行


怎么做?要添加行号吗?

您可以根据类型ID将查询写入订单

然后,如果您使用的是SQL,则可以根据DB使用或限制N,或者使用TSQL和SQL Server来获取前N行


如果您使用的是C代码中基于LINQ的ORM,那么您可以使用,它会根据提供程序的详细信息自动创建相应的查询,以限制结果的数量。

我认为您应该使用查询从类型1中选择3行……然后从类型2中选择多少行,然后将结果添加到一起。

对于SQL Server

编辑:您的问题略有变化

如果您希望每个类别最多包含x个项目,可以使用

以cte为例 从表1中选择*按类型ID按名称rn排序的分区上的行号 从cte中选择TypeID、名称、[Date] rn在哪里
上述查询有效。。谢谢大家…:-

如果每个TypeID需要4行3行,或者只是从最低类型到最高类型所能获取的所有行,该怎么办?您总是从TypeID 1获取所有行吗?例如,如果只需要3行,您是否从TypeId 1获得所有三行,而从TypeId 2获得一行?我已编辑了问题..如果存在,我需要每行4行;否则,给我尽可能多的那种类型。这是一个正确的总结吗?这是相当低效的,因为它需要多次往返数据库。在大多数情况下,最好在一次查询中完成。为什么在第二次查询中需要前8名?根据我对OP的理解,我认为在第二次查询中指定TOP N不是满足OP要求的必要条件。@Greg你是对的,我没有看到问题的编辑。更新。
;With CTE(TypeID,Name,Date,RowNo)
AS
(
select *, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID)  from TableVEG
)
Select Top(@noofRows*2) * from CTE where RowNo<=@noofRows order by rowno