Помогите с этим запросом LINQ to SQL - PullRequest
0 голосов
/ 16 апреля 2011

У меня есть следующий запрос:

var content = (from ca in db.ContentAccesses 
               where !candidateList.Contains(ca.Content) &&
                     ca.DateAccessed >= DateTime.Now.AddDays(-90)
               group ca by ca.ContentId)
               .OrderByDescending(c => c.Count()).Take(5);

, который разрешает следующий T-SQL

SELECT TOP (5) [t1].[ContentId] AS [Key]
FROM (
    SELECT COUNT(*) AS [value], [t0].[ContentId]
    FROM [dbo].[ContentAccesses] AS [t0]
    WHERE (NOT ([t0].[ContentId] = @p0)) AND ([t0].[DateAccessed] >= @p1)
    GROUP BY [t0].[ContentId]
    ) AS [t1]
ORDER BY [t1].[value] DESC

Но мне нужны реальные объекты "Content", а не только ContentId... поэтому я попытался добавить select ca.Content после group by, но компилятор будет жаловаться.

ContentAcceses имеет FK (ContentId) в таблице содержимого.

Я не понимаюLINQ пока неплохо.

Ответы [ 2 ]

2 голосов
/ 16 апреля 2011

Вам нужно сгладить группировки, чтобы получить отдельные объекты из группы.Однако, так как вы хотите сгруппировать каждый ContentAccess Content, вам также следует сгруппировать по этому.

var content = (from ca in db.ContentAccesses 
               where !candidateList.Contains(ca.Content)
                  && ca.DateAccessed >= DateTime.Now.AddDays(-90)
               group ca by ca.ContentId into g
               orderby g.Count() descending
               from ca in g        // flatten the group
               select ca)
              .Take(5);

Чтобы иметь более простой эквивалентный запрос TSQL, вы можете использовать LINQ.Объектам сделать выравнивание и получить первые 5.

var content = (from ca in db.ContentAccesses 
               where !candidateList.Contains(ca.Content)
                  && ca.DateAccessed >= DateTime.Now.AddDays(-90)
               group ca by ca.ContentId into g
               orderby g.Count() descending
               select g)
              .AsEnumerable()     // use LINQ to Objects
              .SelectMany(g => g) // flatten the group
              .Take(5);
0 голосов
/ 16 апреля 2011
var content =  (from ca in db.ContentAccesses 
               where !candidateList.Contains(ca.Content) &&
                     ca.DateAccessed >= DateTime.Now.AddDays(-90)
               group ca by ca.ContentId into cag
               select new
               {
                 ContentId = cag.Key,
                 Contents = cag
               }).OrderByDescending(c => c.Contents.Count()).Take(5);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...