C# 如何从已分组但仍按标题顺序的表中返回数据?
我在SQL Server 2012数据库中有一个简单的表,我正在使用ASP.Net 4.51中的EntityFramework 6查询该表。该表具有以下结构和数据C# 如何从已分组但仍按标题顺序的表中返回数据?,c#,sql,sql-server,linq,C#,Sql,Sql Server,Linq,我在SQL Server 2012数据库中有一个简单的表,我正在使用ASP.Net 4.51中的EntityFramework 6查询该表。该表具有以下结构和数据 FileID GroupID Title DateAdded ------------------------------------------------------ 1 1 Charlie rev 1 21/05/2016 2
FileID GroupID Title DateAdded
------------------------------------------------------
1 1 Charlie rev 1 21/05/2016
2 2 Beta rev 1 22/05/2016
3 1 Charlie rev 2 23/05/2016
4 2 Beta rev 2 24/05/2016
5 3 Alpha rev 1 25/05/2016
基本上,该表表示用户上传的文件和文件修订版,因此,当他们查看数据时,我希望显示组中的第一个文件,然后按以下降序显示所有较旧的修订版。按GroupID
和DateAdded降序排序,我可以得到以下结果
FileID GroupID Title DateAdded
--------------------------------------------------------
3 1 Charlie rev 2 23/05/2016
1 1 Charlie rev 1 21/05/2016
4 2 Beta rev 2 24/06/2016
2 2 Beta rev 1 22/05/2016
5 3 Alpha rev 1 25/05/2016
虽然这接近于我所追求的,但我宁愿先按字母顺序排列标题,然后按日期降序排列所有修订(按组)
我正在寻找此输出:
FileID GroupID Title DateAdded
-----------------------------------------------------
5 3 Alpha rev 1 25/05/2016
4 2 Beta rev 2 24/05/2016
2 2 Beta rev 1 22/05/2016
3 1 Charlie rev 2 23/05/2016
1 1 Charlie rev 1 21/05/2016
我可以通过两个表来实现这一点,但我理想地使用我目前拥有的表来寻找解决方案
任何人都可以用Linq语句来生成此输出吗
简言之,我想我要求的是按每个组的第一个最新标题(按降序日期顺序)对表进行排序,然后按降序日期顺序对每个组的剩余项进行排序
提前感谢您的帮助
编辑:为了满足想要“展示努力”的海报,我知道以下Linq声明将产生第一个结果
var result = context.MyTable.OrderBy(x => x.GroupID)
.ThenByDescending(x => x.DateAdded);
至于第二个结果。。。如果我知道如何实现它,我就不会发帖了。我对SQL并不陌生,但我对这个特殊的问题是陌生的。这不是家庭作业,我花了好几个小时想弄明白。如上所述,我已经使用两个表完成了这项工作,但使用一个表应该可以实现。如果您的逻辑总是将Title
组合为FileName+“rev”+revision.Version
,那么您可以根据该值而不是GroupId
对值进行排序
但是您需要在OrderBy
之前使用切换到LINQ to对象。这将导致您的查询将在不排序的情况下执行,并将数据返回给客户端,然后在客户端排序
下一个查询将返回上一个表中的数据:
var result = context
.MyTable
.AsEnumerable()
.OrderBy(x => x.GetFileName())
.ThenByDescending(x => x.DateAdded);
但是,如果输入字符串只有一个单词,那么这将不会给出期望的单词,因此需要一个特殊情况。但若你们总是使用上面的模式,那个么基于你们的理由,这就足够了
如果需要获得结果,则可以实现一个存储过程,从标题
字段检索子字符串:
var result = context
.MyTable
.AsEnumerable()
.OrderBy(x => x.Title.Substring(0, s.IndexOf(" "))
.ThenByDescending(x => x.DateAdded);
使用普通的旧式SQL
这可能是一个起点:
declare @t table (FileId int, GroupId int, Title varchar(50), DateAdded datetime)
insert into @t
select 1, 1, 'Charlie rev 1', '2016-05-21'
union select 2, 2, 'Beta rev 1', '2016-05-22'
union select 3, 1, 'Charlie rev 2', '2016-05-23'
union select 4, 2, 'Beta rev 2', '2016-05-24'
union select 5, 3, 'Alpha rev 1', '2016-05-25'
select t.*
from @t t
join (
select GroupId, min(Title) as mtitle from @T group by GroupId
) subt on t.GroupId = subt.GroupId
order by subt.mtitle, t.GroupId, t.DateAdded desc
但是我不能马上写出与之相当的Linq
普通的SQL
示例通过从组中选取一个Title
值(在本例中为MIN
值)来工作,并将其作为整个组的代表进行排序
简言之,我想我要求的是按每个组的第一个最新标题(按降序日期顺序)对表进行排序,然后按降序日期顺序对每个组的剩余项进行排序
有几种方法可以在LINQ to对象中实现这一点。但是,LINQ to Entities支持的构造数量有限,因此我建议您使用上述解释的直接翻译:
var result = context.MyTable
.OrderBy(t => context.MyTable
.Where(t1 => t1.GroupId == t.GroupId)
.OrderByDescending(t1 => t1.DateAdded)
.Select(t1 => t1.Title)
.FirstOrDefault())
.ThenByDescending(t => t.DateAdded);
我尝试了一下,这里有一个解决方案,我在上面留下了痕迹。但是,由于时间不够,我没有测试它的mor,而不是提供的测试数据。请随意评论
DECLARE @t TABLE (
FileID int
,GroupID int
,Title nvarchar(50)
,DateAdded date
);
INSERT INTO @t VALUES(1, 1, 'Carlie rev 1', '2016-05-21'), (2, 2, 'Beta rev 1', '2016-05-22'),
(3, 1, 'Carlie rev 2', '2016-05-23'), (4, 2, 'Beta rev 2', '2016-05-24'),
(5, 3, 'Alpha rev 1', '2016-05-25');
WITH cte1 AS(
SELECT *, ROW_NUMBER() OVER (ORDER BY title ASC) AS rn0, ROW_NUMBER() OVER (ORDER BY DateAdded DESC) AS rn1
FROM @t
),
cte2 AS(
SELECT *, rn0*rn1 AS rn3
FROM cte1
)
SELECT FileID, GroupID, Title, DateAdded FROM cte2
ORDER BY rn3
展示你的努力。我认为OP意味着按部分字符串分组,因此Alpha rev
,然后Beta rev
等(数字从标题中提取并按降序排序)。GroupID似乎不相关,但可能仍然有效。您说希望文件名按字母顺序排列,但示例数据中没有这样的列。抱歉,我指的是标题。我会修改的。标题
列是否总是被格式化为某些文本版本#
,重点是版本#
?或者是否存在Title
值,例如Beta版本3
或Charlie first
?否,这将把Alpha rev 1
放在Alpha rev 2
@user1429080 my fail之前。固定答案。感谢您的回复。可悲的是,标题可以是任何东西。groupID是这里的关键。为了说明这一点,用户会上传一个文件,并给它一个他们想要的任何东西的标题。然后,稍后他们可能会上传一个版本到该文件,该文件可能有不同的标题。groupid用于将所有文件保存在一起,因此我知道后续添加是对文件的修订。正如我所说的,我可以让它工作,但我希望每个组中最新文件的输出按字母顺序排列。非常感谢您的努力。补充信息:我刚刚做了另一个测试,有额外的记录-似乎存在导致错误结果的组合:-(我的其他记录是(6,1,'Alpha rev 2','2016-04-22')和(1,2,'Zulu rev 1','2016-11-25')。我将继续尝试修改解决方案