2

このデータ ( IDTime、およびName)を含む配列があります。

var array = new[]
{
    new { ID = 1, Time = DateTime.ParseExact("12:01", "HH:mm", null), Name = "Peter" },
    new { ID = 2, Time = DateTime.ParseExact("12:06", "HH:mm", null), Name = "James" }, 
    new { ID = 3, Time = DateTime.ParseExact("12:03", "HH:mm", null), Name = "Jackie" },
    new { ID = 4, Time = DateTime.ParseExact("12:08", "HH:mm", null), Name = "Peter" }, 
    new { ID = 5, Time = DateTime.ParseExact("12:05", "HH:mm", null), Name = "James" },
    new { ID = 6, Time = DateTime.ParseExact("12:07", "HH:mm", null), Name = "Peter" },
};

配列に対する次のステートメントは、正しい結果を生成します。

var result = array.OrderBy(x => x.Time).GroupBy(x => x.Name)
                  .SelectMany(x => x).ToArray();

結果:

Time: 2013/3/6 12:01:00, Name: Peter
Time: 2013/3/6 12:07:00, Name: Peter
Time: 2013/3/6 12:08:00, Name: Peter
Time: 2013/3/6 12:03:00, Name: Jackie
Time: 2013/3/6 12:05:00, Name: James
Time: 2013/3/6 12:06:00, Name: James

しかし、EF と SQL Server で同じステートメントを使用すると、順序が間違っています。

Time: 2013/3/6 12:03:00, Name: Jackie
Time: 2013/3/6 12:06:00, Name: James
Time: 2013/3/6 12:05:00, Name: James
Time: 2013/3/6 12:07:00, Name: Peter
Time: 2013/3/6 12:01:00, Name: Peter
Time: 2013/3/6 12:08:00, Name: Peter

EF が生成する SQL は次のとおりです。

SELECT 
[Extent2].[Id] AS [Id], 
[Extent2].[Time] AS [Time], 
[Extent2].[Name] AS [Name]
FROM   (SELECT DISTINCT 
    [Extent1].[Name] AS [Name]
    FROM [dbo].[testt1] AS [Extent1] ) AS [Distinct1]
INNER JOIN [dbo].[testt1] AS [Extent2]
ON ([Distinct1].[Name] = [Extent2].[Name]) OR 
   (([Distinct1].[Name] IS NULL) AND ([Extent2].[Name] IS NULL))

order by条項はありません。

  1. 私は何を忘れましたか?これはEFのバグですか?
  2. EF から配列と同じ結果を得るにはどうすればよいですか?
4

1 に答える 1

3

SQLの場合と同じように:

最初のグループ、次に注文:

var result = array.GroupBy(x => x.Name)
                  .Select(x => x.OrderBy(y => y.Time))
                  .SelectMany(x => x)
                  .ToArray();

しかし、あなたの場合、なぜあなたがグループを必要とするのか全くわかりません。毎回異なるように見えるので、(少なくともテストデータで)同じ結果をもたらすより単純なバージョンは次のようになります。

var result = array.OrderBy(x => x.Name)
                  .ThenBy(y => y.Time)
                  .ToArray();
于 2013-03-06T07:09:19.397 に答える