Хорошо у меня есть следующее, установка и работать отлично. Эти строки кода должны сделать преобразование из Объекта 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] (IEnumerable
1 source, Func
2 предиката) в SubSonic. Расширения. База данных. Загрузка [T] (IDataReader rdr, T объект, Список1 ColumnNames) at SubSonic.Extensions.Database.ToEnumerable[T](IDataReader rdr, List
1 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.Query
1. GetEnumerator ()
Возможно, это относится дозвуковое?
Одна из возможностей заключается в том, что это не работает, потому что вы изменили время, в которое материализуется запрос. Измените код на следующий:
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
, что делает его эквивалентным вашему оригинальному коду.
this.ProductOptions.Select(o => o.ToDataModel()).ToList<ProductOptionModel>();
Как я уже сказал, вы используете Первый метод. вы можете изменить его на FirstOrDefault. это будет решено. или вы можете изменить?
Stack Trace
в System.Linq.Enumerable.First
Я думаю, вам нужно проверить длину this.ProductOptions перед оператором LINQ.
Так что возможно (пересмотрено без проверки на null):
returnData.Options = (this.ProductOptions.Length > 0) ? this.ProductOptions.Select(o => o.ToDataModel()) : new List<ProductOptionModel>().AsEnumerable();