2012-02-09 16 views
0

Я пытаюсь заказать группу записей с помощью Guid (наиболее часто используемый), затем группируюсь по этой колонке и беру верхние 3 наиболее используемых гида.Linq to Entities - GroupBy

IList<Records> dbobjs = dbContext.Records 
     .OrderByDescending(t => t.Id) 
     .GroupBy(t => t.Id) 
     .Take(3) 
     .ToList(); 

Это не работает ... Что я делаю неправильно? Его высказывание:

Cannot implicitly convert type 'System.Collections.Generic.List<System.Linq.IGrouping<System.Guid,DataAccessLayer.Records>>' to 'System.Collections.Generic.IList<DataAccessLayer.Records>'. An explicit conversion exists (are you missing a cast?)

Благодаря

+0

Не должен быть уникальным идентификатор? И поэтому «GroupBy» не имеет большого смысла или мне что-то не хватает? –

ответ

10

Ваш запрос возвращает группировки записей, тогда как вы просто пытаетесь присвоить результат запроса IList<Records>. Вас просто интересуют первые три фактические записи? Если да, то вы могли бы использовать:

IList<Records> dbobjs = dbContext.Records 
     .OrderByDescending(t => t.Id) 
     .GroupBy(t => t.Id) 
     .SelectMany(group => group) // Flatten again 
     .Take(3) 
     .ToList(); 

... но в тот момент, это не ясно, что точка группирования. Если вы хотите выбрать только один запись с каждым ID, вы можете использовать:

IList<Records> dbobjs = dbContext.Records 
     .OrderByDescending(t => t.Id) 
     .GroupBy(t => t.Id) 
     .Take(3) 
     .Select(group => group.First()) 
     .ToList(); 

EDIT: Если вам нужны только GUIDs, вы будете использовать:

IList<Guid> guids = dbContext.Records 
     .OrderByDescending(t => t.Id) 
     .GroupBy(t => t.Id) 
     .Take(3) 
     .Select(group => group.Key) 
     .ToList(); 
+0

Столбец «Id» - это все, что мне нужно. Итак, IList <> containg 3 Guid's – Nugs

+0

@Nugs: Если вам нужны только GUID, почему вы пытаетесь назначить 'IList '? Будет редактировать. –

+0

Благодарим за помощь! Это делает трюк. Я ценю дополнительную помощь ... – Nugs

3

Как ошибка четко указано, что GroupBy возвращает набор групп, а не набор записей.

+0

Хорошо, так как это должно быть брошено так, чтобы я мог получить верхние 3 Гида? – Nugs

-1

Если выполнить это чем результат не будет IList. Попробуйте это, вы увидите:

var dbobjs = dbContext.Records 
     .OrderByDescending(t => t.Id) 
     .GroupBy(t => t.Id) 
     .Take(3) 
     .ToList(); 

Перемещение cursur над вар ключевое слово в Visual Studio. ;)