Сортировка анонимных типов - PullRequest
1 голос
/ 07 апреля 2010

У меня вопрос о том, как отсортировать анонимный тип.

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

var submissions = EventSubmissions
    .Where(s => s.EventId.Equals(eventId));

Рассмотрим следующий интерфейс (несколько упрощенно):

public interface IQuerySorter
{
    IOrderedQueryable Sort(IQueryable query);
    IOrderedQueryable<T> Sort<T, U>(IQueryable<T> query, Expression<Func<T,U>> selector);
    ...
}

Использование этого интерфейса позволяет мне реализовать несколько «сортировщиков», например, Дата, рейтинг или то, была ли заявка выдвинута (для голосования).

sortedQuery = sorter.Sort(submissions)

Пока все хорошо. Представление может быть сделано «голосуемым». Я получаю количество голосов, которое может иметь заявка, используя следующий запрос:

var withVoteCount = submissions
    .Select(s => new {NumberOfVotes = s.Votes.Count(), Submission = s});

Я бы хотел отсортировать этот новый запрос по NumberOfVotes, используя мой "общий" класс сортировщика, но столкнулся с проблемой, заключающейся в том, что анонимный тип / член, по-видимому, не находится вне метода репозитория, поэтому я не могу выполнить это.

Любая информация будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2010

Я бы порекомендовал создать представление или хранимую процедуру, используя Group By и Count, чтобы получить те же результаты, что и:

var withVoteCount = submissions
    .Select(s => new {NumberOfVotes = s.Votes.Count(), Submission = s});

Используя SQL, вы можете указать его в порядке подсчета голосов. Примерно так (пример грубый):

select submissions.ID, submissions.Title, count(votes.ID) as NumberOfVotes 
from submissions inner join votes on submissions.id = votes.submissionid
group by submissions.ID, submissions.Title
order by NumberOfVotes desc

После создания представления sql или хранимой процедуры в базе данных SQL-сервера вы можете просто перетащить ее в конструктор Visual Studio и использовать в качестве обычного класса или функции.

0 голосов
/ 07 апреля 2010
...