Динамическая сортировка и фильтрация проецируемых результатов Entity SQL - PullRequest
2 голосов
/ 05 октября 2010

У меня есть следующий запрос, который я хочу отсортировать или отфильтровать, используя прогнозируемые имена классов:

List<CompanyInfo> list = new List<CompanyInfo>();

using (var db = new DbContext())
{
    list.AddRange(
                  db.Companies.Include("Projects")
                  .Select(row => new CompanyInfo()
                  {
                      ProjectCount = (from s in row.Projects
                                      where s.Company.fId == row.fId
                                      select s.pId).Count(),
                      Id = satir.fId,
                  })
                 //.OrderBy("ProjectCount") //<== what I want to do
            );
}

Я хочу динамически упорядочить этот запрос, используя ProjectCount или Id столбцы, аналогичные ESQL, например,.OrderBy("ProjectCount").Поскольку результат запроса является IQueryable вместо ObjectContext, он не работает.Есть ли способ сделать это?

Ответы [ 4 ]

1 голос
/ 05 октября 2010

Взгляните на библиотеку Dynamic LINQ.
Вот учебник , который, кажется, описывает ваш случай.

1 голос
/ 05 октября 2010

Вы можете сделать некоторые изящные вещи с LINQ, если знаете, что делать. Может быть, что-то подобное ??

        var query = db.Companies.Include("Projects").Select(row => 
            new CompanyInfo() 
            { 
                ProjectCount = (from s in row.Projects where s.Company.fId == row.fId select s.pId).Count(), 
                Id = satir.fId, 
            });

        if (orderBy) // orderBy is bool, that tels you what to order by
            query = query.OrderBy(x => x.ProjectCount);
        else
            query = query.OrderBy(x => x.Id);

        list.AddRange(query);
1 голос
/ 05 октября 2010

Вы должны быть в состоянии сделать это так: .OrderBy(p => p.ProjectCount)

0 голосов
/ 06 октября 2010

Спасибо за ответы, я использовал вспомогательные методы расширения:

Сортировка в IQueryable с использованием строки в качестве имени столбца

...