Цикл к преобразованию LINQ -

Хорошо у меня есть следующее, установка и работать отлично. Эти строки кода должны сделать преобразование из Объекта DAL (Дозвукового) к ViewModel.

    IList<ProductOptionModel> OptionsRetData = new List<ProductOptionModel>();

    foreach (var CurProductOption in this.ProductOptions)
    {
        OptionsRetData.Add(CurProductOption.ToDataModel());
    }

    returnData.Options = OptionsRetData.AsEnumerable();

Я хотел бы преобразовать это в одну строку LINQ statment и придумал следующее.

returnData.Options = this.ProductOptions.Select(o => o.ToDataModel());

и получаю следующую ошибку.

Server Error in '/' Application.
Sequence contains no matching element 

Итак, почему делает первую работу statment, но не LINQ и, что шаги могут я брать для разрешения его.

Отслеживание стека

в System. Linq. Счетный. Первый [TSource] (IEnumerable1 source, Func2 предиката) в SubSonic. Расширения. База данных. Загрузка [T] (IDataReader rdr, T объект, Список1 ColumnNames) at SubSonic.Extensions.Database.ToEnumerable[T](IDataReader rdr, List1 ColumnNames) в SubSonic. Linq. Структура. DbQueryProvider. Выполнитесь [T] (QueryCommand1 query, Object[] paramValues) at lambda_method(Closure ) at SubSonic.Linq.Structure.DbQueryProvider.Execute(Expression expression) at SubSonic.Linq.Structure.Query1. GetEnumerator ()

Возможно, это относится дозвуковое?

6
задан LiamB 25 May 2010 в 15:20
поделиться

4 ответа

Одна из возможностей заключается в том, что это не работает, потому что вы изменили время, в которое материализуется запрос. Измените код на следующий:

returnData.Options = this.ProductOptions.Select(o => o.ToDataModel()).ToList();

Это заставит запрос оцениваться в то же время, что и раньше.

EDIT: Ваша трассировка стека показывает, что First() как-то вызывается, но мы не нашли ничего об этом в коде, который вы показали... есть идеи, где это происходит?

EDIT: Я понял разницу - и я глупец, что не сделал этого раньше. Вы хотите заставить проекцию выполняться в процессе:

returnData.Options = this.ProductOptions
                         .AsEnumerable()
                         .Select(o => o.ToDataModel())
                         .ToList();

Этот дополнительный вызов AsEnumerable означает, что будет вызвана перегрузка Enumerable.Select, что делает его эквивалентным вашему оригинальному коду.

7
ответ дан 16 December 2019 в 21:35
поделиться
this.ProductOptions.Select(o => o.ToDataModel()).ToList<ProductOptionModel>();
0
ответ дан 16 December 2019 в 21:35
поделиться

Как я уже сказал, вы используете Первый метод. вы можете изменить его на FirstOrDefault. это будет решено. или вы можете изменить?

Stack Trace

в System.Linq.Enumerable.First

2
ответ дан 16 December 2019 в 21:35
поделиться

Я думаю, вам нужно проверить длину this.ProductOptions перед оператором LINQ.

Так что возможно (пересмотрено без проверки на null):

returnData.Options = (this.ProductOptions.Length > 0) ? this.ProductOptions.Select(o => o.ToDataModel()) : new List<ProductOptionModel>().AsEnumerable();
-1
ответ дан 16 December 2019 в 21:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: