2013-09-25 106 views
2

我不知道爲什麼我在這個SQL和LINQ之間得到不同的結果 你想告訴我爲什麼...?Linq和SQL之間的不同結果

SQL:

select distinct top 50 (id) as d_id 
from talbe1 
where id<>-1 
order by d_id asc; 

的Linq:

IList<int> myResults = 
     (from t in dbconn.table1 
     where t.id != -1 
     orderby t.id ascending 
     select t.id 
     ).Distinct().Take(50).ToList(); 

    int callCnt = 0; 
    foreach (int row in myResults) 
    { 
     callCnt++; 
     Console.WriteLine(callCnt.ToString() + " " + row.ToString()); 
    } 

的SQL得到的結果,我想, 但LINQ的結果是這樣的:

1 72662 
2 84945 
3 264577 
4 77655 
5 71756 
6 76899 
7 76719 
8 77669 
9 152211 
10 79168 
11 72334 
12 71399 
13 246031 
14 80748 
15 77715 

....... 

回答

3

這是一個限制LINQ to SQL,其中OrderBy()必須發生在Distinct()之後,tr y這:

IList<int> myResults = 
    (from t in dbconn.table1 
    where t.id != -1 
    select t.id 
    ).Distinct().OrderBy(t => t).Take(50).ToList(); 
+0

該死,我錯過了通過*此*多:P快速編輯,但...應該是'.OrderBy(T => T) '因爲這是一個'IEnumerable '。 – Corey

+0

+1 - 趕上科裏,編輯答案輸入得太快:-) –

+0

這就是爲什麼我錯過了第一個答案...我輸入較慢:P – Corey

3

問題是Distinct()方法的工作方式。不幸的是它可以(並且通常)改變列表中項目的順序。您需要在之後Distinct()之後訂購清單

試試這個:

IList<int> myResults = 
    (
     from t in dbconn.table1 
     where t.id != -1 
     select t.id 
    ).Distinct().OrderBy(i => i).Take(50).ToList(); 
0

嘗試

var myResults = dbconn.Table1.Where(e => e.id != -1).Select(e => e.id).Distinct() 
     .OrderBy(t => t).Take(50).ToList(); 
+0

1.不起作用。 2.不返回'IList '。 3.不解釋*爲什麼*。 – Corey

+0

抱歉,現在已修復。 –

相關問題