循环到LINQ转换 -

时间:2010-05-25 15:02:35

标签: c# asp.net asp.net-mvc linq subsonic

好的我有以下,设置和工作很好。这些代码行应该从DAL实体(Subsonic)转换为ViewModel。

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

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

    returnData.Options = OptionsRetData.AsEnumerable();

我想将其转换为LINQ单行语句并提出以下内容。

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

我收到了以下错误。

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

那么为什么第一个语句有效但LINQ没有,我可以采取哪些步骤来解决它。

  

堆栈跟踪

     

在   System.Linq.Enumerable.First [TSource](IEnumerable 1 source, Func 2谓词)at at   SubSonic.Extensions.Database.Load [T](IDataReader的   rdr,T item,List 1 ColumnNames) at SubSonic.Extensions.Database.ToEnumerable[T](IDataReader rdr, List 1 ColumnNames)at   SubSonic.Linq.Structure.DbQueryProvider.Execute [T](QueryCommand 1 query, Object[] paramValues) at lambda_method(Closure ) at SubSonic.Linq.Structure.DbQueryProvider.Execute(Expression expression) at SubSonic.Linq.Structure.Query 1.GetEnumerator()

也许这与亚音速有关?

4 个答案:

答案 0 :(得分:7)

一种可能性是它不起作用,因为您已经改变了查询的具体化时间。请将代码改为:

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

这将迫使查询在之前的同时进行评估。

编辑:您的堆栈跟踪显示First()以某种方式被调用,但我们在您显示的代码中没有任何相关内容......任何有关这种情况的想法?

编辑:我意识到了这一点 - 我以前没有这样做是愚蠢的。您希望强制投影在进程中完成:

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

AsEnumerable的额外调用意味着它将被调用Enumerable.Select重载,使其等同于您的原始代码。

答案 1 :(得分:2)

正如我所说,你正在使用First方法。您可能想将其更改为FirstOrDefault。它会被解决。 你能改变吗?

  

堆栈跟踪

     

在System.Linq.Enumerable.First

答案 2 :(得分:0)

this.ProductOptions.Select(o => o.ToDataModel()).ToList<ProductOptionModel>();

答案 3 :(得分:-1)

我认为您必须在LINQ语句之前检查 this.ProductOptions 的长度。

所以也许(修改后不检查null):

returnData.Options = (this.ProductOptions.Length > 0) ? this.ProductOptions.Select(o => o.ToDataModel()) : new List<ProductOptionModel>().AsEnumerable();