2013-09-25 3 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 у этого:

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 (т => т) 'поскольку это' IEnumerable 'в этой точке. – Corey

+0

+1 - хороший улов Corey, отредактированный ответ набрал слишком быстро :-) –

+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

извините, теперь исправлено. –

Смежные вопросы