Проблема с DISTINCT и Linq2SQL - PullRequest
       1

Проблема с DISTINCT и Linq2SQL

0 голосов
/ 20 марта 2011

У меня есть такая таблица:

idinterpretation | iddictionary | idword | meaning
1                   1              1115     hello
2                   1              1115     hi
3                   1              1115     hi, bro
5                   1              1118     good bye
6                   1              1118     bye-bye
7                   2              1119     yes 
8                   2              1119     yeah
9                   2              1119     all rigth

И я пытаюсь получить разные строки (DISTINCT idword). Итак, сначала я попробовал:

return dc.interpretations.Where(i => i.iddictionary == iddict).
    ToList<interpretation>().Distinct(new WordsInDictionaryDistinct()).
    OrderBy(w => w.word.word1).Skip(iSkip).Take(iTake);

Но у меня в таблице около 300 000 строк, и это неправильное решение.

Тогда я попробовал:

    IEnumerable<interpretation> res = (from interp in dc.interpretations
                                      group interp by interp.idword into groupedres
                                      select new interpretation
                                      {
                                          idword = groupedres.Key,
                                          idinterpretation = groupedres.SingleOrDefault(i => i.idword == groupedres.Key).idinterpretation,
                                          interpretation1 = groupedres.SingleOrDefault(i => i.idword == groupedres.Key).interpretation1,
                                          iddictionary = groupedres.SingleOrDefault(i => i.idword == groupedres.Key).iddictionary
                                      }).Skip(iSkip).Take(iTake);

и я принял ошибку: @foreach (interpretation interp in ViewBag.Interps) System.NotSupportedException: Explicit construction of entity type 'vslovare.Models.interpretation' in query is not allowed.

Действительно ли это способ взять отдельные строки и получить в конечных строках, например:

idinterpretation | iddictionary | idword | meaning
1                   1              1115     hello
5                   1              1118     good bye
7                   2              1119     yes 


словари:

dictionary table

iddictionary | dictionary_name

слова:

word table

idword | word_name

интерпретация:

interpretation table

idinterpretation | iddictionary | idword | meaning

1 Ответ

2 голосов
/ 20 марта 2011

Я думаю, что ваша вторая попытка уже почти готова - вам, вероятно, нужно использовать предложение GroupBy, чтобы это работало в SQL.

Что-то вроде:

var query = from row in dc.interpretations
            where row.iddictionary == iddict
            group row by idword into grouped
            select grouped.FirstOrDefault();

return query.OrderBy(w => w.word.word1).Skip(iSkip).Take(iTake);

От того, почему ваш запрос занимает слишком много времени - в общем, если ваш запрос медленный, это будет потому, что данные, которые вы ищете и возвращаете, действительно велики - или потому что они плохо проиндексированы на уровне базы данных. Чтобы выяснить это, он анализирует или профилирует ваш запрос - см. Эту статью на MSDN http://msdn.microsoft.com/en-us/magazine/cc163749.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...