2016-12-10 6 views
2

Я пытаюсь заказать атрибут связанного объекта. Это пример. У меня есть эти два класса:OrderBy using Dynamic Linq with Relation

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

public class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int PublicationId { get; set; } 
    [ForeignKey("PublicationId")] 
    public Publication Publication { get; set; } 
    public int Category { get;set; } 
} 

Теперь мне нужно, чтобы получить все публикации с продукта Категория = 1 и упорядочены по публикации Id по алфавиту:

IQueryable<Publication> query = db.Publications.Where("Products.Any(Category = 1)"); 
List<Publication> list = query.OrderBy("Id desc").ToList(); 

Это работает отлично! Но ... Как я могу заказать публикации по категории продукта (desc или asc) с помощью Dynamic Linq?

+0

Не можете ли вы просто сделать OderByDescending? (https://msdn.microsoft.com/en-us/library/bb534861(v=vs.110).aspx) – Clueless

+0

Заказ (по возрастанию или по убыванию) теперь не является проблемой. Проблема заключается в том, как упорядочить (в asc или desc) отношение. В этом случае Категория (из Продукта) –

+1

'Publication' имеет один или несколько продуктов и, следовательно, категории. Сначала вы должны определить, как хотите сортировать коллекции категорий. –

ответ

0

я не нашел, как это сделать с помощью System.Linq.Dynamic но для Linq это работает

var query = publications.OrderByDescending(p => p.Products.Select(x => x.Category).FirstOrDefault()).ToList(); 

Вот тестовый класс:

var publications = new List<Publication> 
     { 
      new Publication 
      { 
       Products = new List<Product> 
       { 
        new Product {Category = 5}, 
        new Product {Category = 6}, 
        new Product {Category = 7} 
       } 
      }, 
      new Publication 
      { 
       Products = new List<Product> 
       { 
        new Product {Category = 2}, 
        new Product {Category = 3}, 
        new Product {Category = 4} 
       } 
      }, 
      new Publication 
      { 
       Products = new List<Product> 
       { 
        new Product {Category = 8}, 
        new Product {Category = 9}, 
        new Product {Category = 10} 
       } 
      } 
     }; 

     var query = publications.OrderByDescending(p => p.Products.Select(x => x.Category).FirstOrDefault()).ToList(); 

     query.ForEach(x => Console.WriteLine(x.ToString())); 

Выход был:

8 , 9 , 10 
5 , 6 , 7 
2 , 3 , 4 

Как вы видите, он не делает внутренний заказ Products.

+0

Спасибо, но мне это нужно в Dynamic Linq. –

+0

Хорошо, я позабочусь о том, каковы ваши критерии заказа? Но только из любопытства, почему Dynamic Linq, если вы можете использовать «обычный»? –

+0

Это beacause Я строю строковый запрос из url в webapi. Все это сделано динамически. Все работает нормально. Мне просто нужно это, чтобы завершить проект. Заказ, который вы сделали, в порядке. Публикации заказывали asc или desc на основе вложенной категории продуктов. –