2010-03-05 2 views
3

В моем сервисном слое для моего приложения MVC я пытаюсь преобразовать результаты linq в sql в объекты моей бизнес-модели. Я в настоящее время пытается следующий код:Можете ли вы вернуть доход в IList <T>?

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); 

    } 

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

ответ

7

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

+0

+1 для комментариев по Сортировка .. –

+0

Это имеет смысл, спасибо :) – KallDrexx

+0

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

1

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

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

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

2

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

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

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

+0

А это объясняет мою путаницу. Я не понимал, что есть IEnumerator, я думал, что это просто IEnumable – KallDrexx

2

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

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

или просто

var results = from p in _context.Repository<DBMappings.project>() 
        select CreateProjectEntityFromDBProject(p); 
return results.ToList(); 
+0

А хорошая идея! Не понимал, что я могу это сделать. – KallDrexx

+0

Благодаря тому, как отличается Linq от обычного C#, легко забыть, что он все еще C# там ... – JasonTrue

Смежные вопросы