C# 环路到LINQ转换-
好的,我有以下设置和工作很好。这些代码行应该从DAL实体(亚音速)转换为ViewModelC# 环路到LINQ转换-,c#,asp.net,asp.net-mvc,linq,subsonic,C#,Asp.net,Asp.net Mvc,Linq,Subsonic,好的,我有以下设置和工作很好。这些代码行应该从DAL实体(亚音速)转换为ViewModel IList<ProductOptionModel> OptionsRetData = new List<ProductOptionModel>(); foreach (var CurProductOption in this.ProductOptions) { OptionsRetData.Add(CurProductOption.ToDa
IList<ProductOptionModel> OptionsRetData = new List<ProductOptionModel>();
foreach (var CurProductOption in this.ProductOptions)
{
OptionsRetData.Add(CurProductOption.ToDataModel());
}
returnData.Options = OptionsRetData.AsEnumerable();
我收到以下错误
Server Error in '/' Application.
Sequence contains no matching element
那么,为什么第一个statment有效,而LINQ无效,我可以采取什么步骤来解决它呢
堆栈跟踪
在
System.Linq.Enumerable.First[TSource](IEnumerable1
源代码,Func
2谓词)位于
亚音速.扩展.数据库.加载[T](IDataReader)
rdr,T项,列表1列名称)
亚音速.扩展.数据库.ToEnumerable[T](IDataReader)
rdr,列出
1列名称)位于
亚音速.Linq.Structure.DbQueryProvider.Execute[T](QueryCommand1
查询,对象[]参数值)位于
lambda_法(闭包法)
亚音速.Linq.Structure.DbQueryProvider.Execute(表达式
表达式)在
亚音速.Linq.Structure.Query
1.GetEnumerator()
也许这与亚音速有关?一种可能是它不起作用,因为您更改了查询的具体化时间。将代码改为:
returnData.Options = this.ProductOptions.Select(o => o.ToDataModel()).ToList();
这将强制在查询之前的同一时间对其求值
编辑:您的堆栈跟踪显示以某种方式调用了First()
,但在您显示的代码中我们没有任何关于这一点的信息。。。知道在哪里发生的吗
编辑:我已经意识到了其中的区别——我以前没有这么做是愚蠢的。您希望强制投影在过程中完成:
returnData.Options = this.ProductOptions
.AsEnumerable()
.Select(o => o.ToDataModel())
.ToList();
对AsEnumerable
的额外调用意味着它将是可枚举的。选择被调用的重载,使其与原始代码等效。this.ProductOptions.Select(o=>o.ToDataModel()).ToList();
this.ProductOptions.Select(o => o.ToDataModel()).ToList<ProductOptionModel>();
我认为您必须在LINQ语句之前检查this.ProductOptions的长度
因此可能(修订时未检查null):
returnData.Options=(this.ProductOptions.Length>0)?this.ProductOptions.Select(o=>o.ToDataModel()):new List().AsEnumerable();
正如我所说,您使用的是第一种方法。您可能需要将其更改为FirstOrDefault。这将得到解决。或者你能改变吗
堆栈跟踪
在System.Linq.Enumerable.First
异常的调用堆栈是什么?ToDataModel()的返回类型是什么?@Dave Swersky-返回类型是ProductOption模型我认为“select”方法不会抛出任何错误。你用过“单一”方法吗?我也有过类似的错误。仔细检查选项集合的返回类型是否相同,而ProductOptions是否相同null@Jon飞碟-谢谢你的回复。添加.ToList()会导致相同的错误。(现在就在这条线上,而不是在视野中)@Jon Skeet-Sneeky怀疑这与亚音速有关。因为我没有实际调用.First()@乔恩·斯基特-你有这么高的知名度是有原因的。再次感谢你,这很有效。有什么地方可以让我多读一点你写的东西吗?@皮诺:真奇怪。很抱歉suggestions@cem别为这件事不坏而难过,我感谢你的帮助!使用示例行时出现相同的问题。可能不需要检查null。循环之所以有效,是因为当长度为0时,程序流永远不会进入循环。如果没有获得任何值,则选择不应失败。。。它应该只产生一个空的结果。正如我所说的,我不是直接称之为空。这似乎是深亚音速文件。也许这就是问题的根源?是的。这就是为什么会发生这种情况。编辑也许使用try-catch语句可以解决这个问题。你试过了吗?
this.ProductOptions.Select(o => o.ToDataModel()).ToList<ProductOptionModel>();
returnData.Options = (this.ProductOptions.Length > 0) ? this.ProductOptions.Select(o => o.ToDataModel()) : new List<ProductOptionModel>().AsEnumerable();