Можете ли вы вернуть доход в IList <T>? - PullRequest
3 голосов
/ 05 марта 2010

На своем сервисном уровне для приложения MVC я пытаюсь преобразовать результаты сущностей linq в sql в сущности моей бизнес-модели. В настоящее время я пытаюсь следующий код:

    public IList<Project> GetAllProjects()
    {
        var results = from p in _context.Repository<DBMappings.project>()
                      select p;

        foreach (DBMappings.project prj in results.ToList<DBMappings.project>())
            yield return CreateProjectEntityFromDBProject(prj);

    }

К сожалению, это, похоже, не работает, и я могу только догадываться, что yield работает только с IEnumerable. Есть ли другое решение, кроме создания нового списка, добавления элементов в цикл foreach и возврата списка? Мне нужно использовать IList, потому что методы, которые используют возвращенный список, должны иметь возможность выполнять методы List, такие как .Sort ().

Ответы [ 4 ]

7 голосов
/ 05 марта 2010

если вы хотите .Sort(), вам определенно следует создать список в вашем методе. использование yield экономит память: результаты не сохраняются как один объект. Это полезно, когда вы просто хотите просмотреть результаты. но если вы хотите что-то отсортировать, вам нужно это в памяти как один кусок.

2 голосов
/ 05 марта 2010

Вы не можете «лениво вернуть» список, но кажется, что вы можете получить то, что вы хотите:

return results.Select(prj=>CreateProjectEntityFromDBProject(prj)).ToList();

или просто

var results = from p in _context.Repository<DBMappings.project>()
                  select CreateProjectEntityFromDBProject(p);
return results.ToList();
2 голосов
/ 05 марта 2010

Раздел 8.14 спецификации C # (выделено мое):

Отчет о доходности используется в блок итератора (§8.2) для получения значения к объекту перечислителя (§10.14.4) или перечислимый объект (§10.14.5) итератор или сигнализировать конец итерации.

IList реализует IEnumerable, но не реализует IEnumerator.

1 голос
/ 05 марта 2010

IList<T> описывает функциональность, которая несовместима с IEnumerable<T>, по крайней мере, в случае отложенной загрузки.

Чтобы иметь возможность перейти к определенному индексу а-ля IList<T>, требуется, чтобы все перечисление было «перечислено», по крайней мере, до указанного индекса.

Если вас не интересует оценка всего IEnumerable<T>, вы можете создать List<T>, взяв IEnumerable<T> в качестве параметра конструктора, а затем вернуть List<T> в качестве IList<T>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...