Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从已分组但仍按标题顺序的表中返回数据?_C#_Sql_Sql Server_Linq - Fatal编程技术网

C# 如何从已分组但仍按标题顺序的表中返回数据?

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

我在SQL Server 2012数据库中有一个简单的表,我正在使用ASP.Net 4.51中的EntityFramework 6查询该表。该表具有以下结构和数据

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')。我将继续尝试修改解决方案