В моем приложении есть довольно много существующих «служебных команд», которые обычно возвращают List<TEntity>
. Однако я написал их таким образом, что любые запросы не будут оцениваться до самого последнего оператора, когда они будут преобразованы ToList<TEntity>
(или, по крайней мере, я так думаю).
Теперь мне нужно начать получать некоторую «контекстно-зависимую» информацию от команд, и я думаю сделать следующее:
- Сохраните существующие команды такими же, как сегодня, но убедитесь, что они возвращают
IEnumerable<TEntity>
, а неIList<TEntity>
. - Создайте новые команды, которые вызывают старые команды, но возвращают
IEnumerable<TResult>
, гдеTResult
— это не сущность, а скорее модель представления, модель результата и т. д. — некоторое представление данных, полезное для приложения.
Первый случай, когда мне это понадобилось, — это поиск объекта Group
. В моей схеме Group
s идут со специфическими для User
разрешениями, но выплевывать в свой результат весь список пользователей и разрешений мне не реально - во-первых, потому что пользователей может быть много, во-вторых, потому что разрешений много, и в-третьих, потому что эта информация не должна быть доступна недостаточно привилегированным пользователям (т.е. "гость" не должен видеть, что может делать "член").
Итак, я хочу иметь возможность взять результат исходной команды, IEnumerable<Group>
, и описать, как каждое Group
должно быть преобразовано в GroupResult
при заданном вводе User
(в данном случае Username
).
Если я попытаюсь перебрать результат исходной команды с помощью ForEach
, я знаю, что это приведет к принудительному выполнению результата и, следовательно, потенциально приведет к ненужному увеличению времени выполнения. Что, если бы я захотел дополнительно составить результат «новой» команды (которая возвращает GroupResult
) и отфильтровать определенные группы? Тогда, возможно, я бы вычислил массу привилегий для введенного пользователя, только чтобы позже отфильтровать родительские объекты GroupResult
!
Я предполагаю, что мой вопрос сводится к... как мне сообщить C#, как я хотел бы преобразовать каждый член IEnumerable
, не обязательно делая это во время запуска метода?
.Select(group => new GroupResult(...))
? - person Iridium   schedule 17.05.2014