代码之家  ›  专栏  ›  技术社区  ›  LiamB

循环到LINQ转换-

  •  6
  • LiamB  · 技术社区  · 15 年前

    好的,我有以下几点,准备和工作都很好。这些代码行应该完成从DAL实体(亚音速)到视图模型的转换。

        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[t源](IEnumerable 1 source, Func 2个谓词)at 亚音速.extensions.database.load[t](idataReader RDR,T项,列表 1 ColumnNames) at SubSonic.Extensions.Database.ToEnumerable[T](IDataReader rdr, List 1列名称)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 回复  |  直到 15 年前
        1
  •  7
  •   Jon Skeet    15 年前

    一种可能是它不起作用,因为您更改了查询实现的时间。将代码改为:

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

    这将强制在查询之前的同一时间对其进行计算。

    编辑:正在显示堆栈跟踪 First() 不知何故被调用,但在您所显示的代码中,我们对此一无所知…你知道这是怎么回事吗?

    编辑:我已经意识到了区别——我以前不这么做是愚蠢的。您希望强制在进程中进行投影:

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

    额外的电话 AsEnumerable 意味着它将是 Enumerable.Select 调用的重载,使其与原始代码等效。

        2
  •  2
  •   cem    15 年前

    就像我说的,你用的是第一种方法。您可能希望将其更改为FirstOrDefault。这将得到解决。 你能改变吗?

    堆栈跟踪

    在System.Linq.Enumerable.First

        3
  •  0
  •   Kevin Le - Khnle    15 年前
    this.ProductOptions.Select(o => o.ToDataModel()).ToList<ProductOptionModel>();
    
        4
  •  -1
  •   Kevin Le - Khnle    15 年前

    我想你得检查一下 this.productOptions(此.productOptions) 在Linq语句之前。

    所以可能(修订时不检查是否为空):

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