2013-03-06 78 views
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 

這裏是SQL EF產生:

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中獲取與數組相同的結果?
+0

就不得不說:這是一個非常好問的問題。你有代碼來重現(至少在linq到對象),期望的輸出,實際的輸出,生成的SQL,甚至格式良好。保持! – Kobi 2013-03-06 07:19:18

回答

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();