Lia*_*amB 6 c# linq asp.net subsonic asp.net-mvc
好的,我有以下,设置和工作很好.这些代码行应该从DAL实体(Subsonic)转换为ViewModel.
IList<ProductOptionModel> OptionsRetData = new List<ProductOptionModel>();
foreach (var CurProductOption in this.ProductOptions)
{
OptionsRetData.Add(CurProductOption.ToDataModel());
}
returnData.Options = OptionsRetData.AsEnumerable();
Run Code Online (Sandbox Code Playgroud)
我想将其转换为LINQ单行语句并提出以下内容.
returnData.Options = this.ProductOptions.Select(o => o.ToDataModel());
Run Code Online (Sandbox Code Playgroud)
并收到以下错误.
Server Error in '/' Application.
Sequence contains no matching element
Run Code Online (Sandbox Code Playgroud)
那么为什么第一个语句可以工作但不是LINQ,我可以采取哪些步骤来解决它.
堆栈跟踪
在
1 source, FuncSubSonic.Linq.Structure.DbQueryProvider.Execute [T]的SubSonic.Extensions.Database.Load [T](IDataReader rdr,T item,List1 ColumnNames) at SubSonic.Extensions.Database.ToEnumerable[T](IDataReader rdr, List1 ColumnNames)的System.Linq.Enumerable.First [TSource](IEnumerable 2谓词)中](QueryCommand1 query, Object[] paramValues) at lambda_method(Closure ) at SubSonic.Linq.Structure.DbQueryProvider.Execute(Expression expression) at SubSonic.Linq.Structure.Query1.GetEnumerator()
也许这与亚音速有关?
一种可能性是它不起作用,因为您已经改变了查询实现的时间.将代码更改为:
returnData.Options = this.ProductOptions.Select(o => o.ToDataModel()).ToList();
Run Code Online (Sandbox Code Playgroud)
这将迫使查询与之前同时进行评估.
编辑:您的堆栈跟踪显示First()以某种方式被调用,但我们在您显示的代码中没有任何相关内容...任何想法发生了什么?
编辑:我意识到了差异 - 我以前没有这样做是愚蠢的.您希望强制投影在进程中完成:
returnData.Options = this.ProductOptions
.AsEnumerable()
.Select(o => o.ToDataModel())
.ToList();
Run Code Online (Sandbox Code Playgroud)
额外的调用AsEnumerable意味着它将Enumerable.Select被调用的重载,使其等同于您的原始代码.
| 归档时间: |
|
| 查看次数: |
1242 次 |
| 最近记录: |