DISTINCT和Linq2SQL的问题

时间:2011-03-20 15:27:09

标签: asp.net-mvc linq linq-to-sql ado.net

我有一张这样的表:

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 个答案:

答案 0 :(得分:2)

我认为您的第二次尝试几乎就在那里 - 您可能需要使用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