2009-10-12 3 views
0

Я получаю последние 20 обновленные записи в базе данных с помощью следующейASP.Net MVC Linq Группировка запросов

var files = (from f in filesContext.Files 
         join ur in filesContext.aspnet_Roles on f.Authority equals ur.RoleId 
         join u in filesContext.aspnet_Users on f.Uploader equals u.UserId 
         orderby f.UploadDate descending 
         select new FileInfo { File = f, User = u, UserRole = ur }).Take(20); 

Я затем разделив результаты на мой взгляд:

<%foreach(var group in Model.GroupBy(f => f.UserRole.RoleName)) {%> 
//output table here 

Этот отлично, поскольку таблица отображается для каждой из моих ролей. Однако, как и ожидалось, я получаю последние 20 записей в целом, как я могу получить последние 20 записей за роль?

Так что я в конечном итоге с:

UserRole1

// Последние 20 записей, относящихся к этому UserRole1

UserRole2

// Последние 20 записей, относящихся к этому UserRole2

UserRole3

// Последние 2 0 Записей, относящихся к этому UserRole3

ответ

1

Я могу придумать три возможных способа сделать это. Во-первых, получите все роли, затем выполните запрос Take (20) на роль, агрегируя результаты в вашу модель. Это может быть или не быть много разных запросов в зависимости от количества ролей, которые у вас есть. Во-вторых, получите все результаты, затем отфильтруйте последние 20 на роль в вашем представлении. Это может быть очень большой запрос, занимающий много времени. В-третьих, получите большое количество результатов, которые, вероятно, будут иметь по крайней мере 20 записей на роль (но не гарантированы), а затем отфильтровать последние 20 на роль в вашем представлении. Я бы, вероятно, использовал первый или третий варианты в зависимости от того, насколько важно получить 20 результатов.

var files = (from f in filesContext.Files 
      join ur in filesContext.aspnet_Roles on f.Authority equals ur.RoleId 
      join u in filesContext.aspnet_Users on f.Uploader equals u.UserId 
      orderby f.UploadDate descending 
      select new FileInfo { File = f, User = u, UserRole = ur }) 
      .Take(2000); 


<% foreach (var group in Model.GroupBy(f => f.UserRole.RoleName, 
            (role,infos) => 
             new { 
               Key = role.RoleName, 
               Selected = infos.Take(20) 
              }))           { %> 

    <%= group.Key %> 
    <% foreach (var selection in group.Selected) 
     { %> 
     ... 
+0

Большое спасибо за ваши предложения. Я думаю, что вариант 3 будет лучшим методом для этой системы, так как в конечном итоге будет много ролей, и вставки в базу данных, вероятно, будут распределены по всем ролям, поэтому захват х-суммы должен покрыть ее. – 2009-10-13 12:40:41

0

Вы можете либо подсчитать элементы и пропустить первые (длина - 20) элементы, либо просто перевернуть/взять 20/назад.

foreach (var group in Model.GroupBy(f => f.UserRole.RoleName)) 
{ 
    // draw table header 
    foreach (item in group.Reverse().Take(20).Reverse()) 
    { 
     // draw item 
    } 

    // Or 
    int skippedElementCount = group.Count() - 20; 
    if (skippedElementCount < 0) skippedElementCount = 0; 

    foreach (item in group.Skip(skippedElementCount)) 
    { 
     // draw item 
    } 

    // draw table footer 
} 
Смежные вопросы