Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 环路到LINQ转换-_C#_Asp.net_Asp.net Mvc_Linq_Subsonic - Fatal编程技术网

C# 环路到LINQ转换-

C# 环路到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

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

    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](IEnumerable
1
源代码,Func
2谓词)位于 亚音速.扩展.数据库.加载[T](IDataReader) rdr,T项,列表
1列名称)
亚音速.扩展.数据库.ToEnumerable[T](IDataReader)
rdr,列出
1列名称)位于 亚音速.Linq.Structure.DbQueryProvider.Execute[T](QueryCommand
1
查询,对象[]参数值)位于
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();