Как вернуть IList из моего репозитория с заказанными запросами в LINQ / EF - PullRequest
2 голосов
/ 30 марта 2011

Мой слой репозитория работал нормально, выставляя IList<T> для списков таких вещей, как GetAll() и т. Д. Однако я попытался использовать OrderBy в одном из моих запросов LINQ. Затем я столкнулся с очень большими проблемами, потому что запрос LINQ не может быть преобразован в IList. Он хочет вернуть IOrderedEnumerable.

Это большая проблема, потому что я хочу, чтобы мое хранилище было автономным, а НЕ выставляло IQueryable на мои услуги. Зачем мне менять архитектуру репо только из-за 'orderby'!

Итак, несмотря на это, я приступил к преобразованию уровня хранилища в возвращаемый IEnumerable, чтобы я мог хотя бы вернуть отсортированные данные. Затем я столкнулся с большим количеством проблем, потому что тогда мне нужно было преобразовать мои классы данных в IEnumerable, чтобы я мог легко сопоставлять свою модель представления и классы модели данных. (Это использует AutoMapper).

Затем я понял, что code-first не нравится IEnumerable и он не будет строить отношения между таблицами, если не определен с использованием по крайней мере IList (и мне также сказали ICollection ??).

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

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Это, например, работает, сортирует и возвращает IList<T>:

public class Customer
{
    public int CustomerId { get; set; }
    public string Name { get; set; }
    public string City { get; set; }
}

public IList<Customer> GetSortedListOfCustomersInCity(string city)
{
    return context.Customers
        .Where(c => c.City == city)
        .OrderBy(c => c.Name)
        .ToList();
}

(Я думаю, что именно это и имел в виду Рид Копси в своем ответе.) Думаю, ваша проблема другого рода, поскольку слишком очевидно, что этот пример работает. Но я не могу извлечь из ваших вопросов, где именно ваша проблема. Ценность вашего неработающего кода приветствуется.

1 голос
/ 30 марта 2011

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

Когда вы создаете свои запросы, вывсегда может вернуть results.ToList(), который оценит их и преобразует в IList<T> для вас.

Во многих случаях это выгодно, если в любом случае ваш запрос является внутренним IQueryable<T>, так какон полностью оценит запрос и предотвратит проблемы, которые могут возникнуть, если вы закроете свой внутренний контекст данных, а затем попытаетесь перечислить результаты.

...