2016-12-13 1 views
1

Я использую Ef6 и я создал эти две модели:Получить список упорядоченный по количеству записей из другой таблицы с помощью Linq

public class Publication 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Product> Products { get; set; } 
} 

public class ViewLog 
{ 
    public int Id { get; set; } 
    public int? UserId { get; set; } 
    [ForeignKey("UserId")] 
    public User.User User { get; set; } 
    public int? SessionId { get; set; } 
    [ForeignKey("SessionId")] 
    public User.Session Session { get; set; } 
    public int PublicationId { get; set; } 
    [ForeignKey("PublicationId")] 
    public Publication.Publication Publication { get; set; } 
    public DateTime Created { get; set; } 
} 

Каждый раз, когда я посещаю Публикацию я создаю новую запись в таблицу ViewLog. Теперь, используя Linq, мне нужно получить все публикации, упорядоченные по количеству ViewLogs (посещений) за публикацию за последние 24 часа. (Если публикация не имеет ViewLogs они должны выглядеть слишком, но, очевидно, после публикаций, имеет viewlogs)

+0

ли вы попробовать что-нибудь? Вы можете попробовать «Left Join» с 'Group BY' с' Count Count'. –

+0

Да, я знаю, как получить это с помощью SQL, но я не могу найти что-то подобное в Linq. –

ответ

3

Вы можете использовать GroupJoin когда вы не имеете навигационные свойства и требуют левого внешнего соединения

Синтаксис лямбда выглядит следующим образом:

var publicationQuery = new List<Publication>().AsQueryable(); 
var viewLogQuery = new List<ViewLog>().AsQueryable(); 

var leftJoinQuery = publicationQuery 
    .GroupJoin(viewLogQuery, x => x.Id, x => x.PublicationId, (pub, logs) => new 
    { 
     PublicationId = pub.Id, 
     LogCount = logs.Count() 
    }) 
    .OrderByDescending(x => x.LogCount); 

Я также нашел эту Query Expression Translation Cheat Sheet очень полезно, чтобы перейти от выражений запросов (которые ближе к SQL) синтаксису метода лямбда (который я предпочитаю)

Если у вас есть свойство навигации Publication.ViewLogs (который является List<ViewLog>), то вы можете просто использовать Select() с проекцией

var publicationQuery = new List<Publication>().AsQueryable(); // From a DbSet... 

var query = publicationQuery 
    .Select(x => new 
    { 
     PublicationId = x.Id, 
     LogCount = x.ViewLogs.Count 
    }) 
    .OrderByDescending(x => x.LogCount); 
+0

Andrés, если я создаю свойство навигации, например, создание списка ViewLogs в публикациях, это проще? (У меня уже есть идентификатор публикации в ViewLog). Не могли бы вы также привести пример этой ситуации? Большое спасибо!! –

+0

Обновлен мой ответ ... не уверен, есть ли у вас какие-либо другие требования, которые не отражаются в вопросе ... –

Смежные вопросы