我有两行代码,一行是
AllItems().Where(c => c.Id== id)
.Select(d => new Quality(d.QualityType)).ToList();
还有一个
AllItems().Where(c => c.Id== id).ToList()
.Select(d => new Quality(d.QualityType)).ToList();
唯一的区别是第二个语句 ToList()
在 Where
语句之后被调用。第二个语句工作得很好。
在第一个语句中,命中默认的无参数构造函数而不是带参数的构造函数。因此创建了列表,但列表中的对象使用默认值而不是 d.QualityType 进行了初始化。
您可以在(方法:GetBestQualityInHistory)中查看相关文件的完整来源
https://github.com/kayone/NzbDrone/blob/master/NzbDrone.Core/Providers/HistoryProvider.cs
**编辑:经过进一步调查,这似乎是一个 SubSonic 错误,如果 Last ToList
被替换为 OrderBy
subsonic 会抛出一个 构造函数不支持“Void .ctor(NzbDrone.Core.Repository.Quality.QualityTypes, Boolean)”
。
最佳答案
如果 SubSonic 的工作方式与 Entity 框架相同,则您不能使用带参数的构造函数 - 您必须使用无参数的构造函数和初始值设定项。我对此的非常高层次的解释是,查询没有按原样执行——它被翻译成 SQL,因此你必须使用属性初始值设定项,以便表达式树知道投影类型中的哪些属性应该由值填充。当使用带参数的构造函数时,表达式树不知道传递的参数属于哪里(它不检查构造函数的内容)。一旦您执行 Tolist
并且结果集被具体化为 QuantityType
实例,就会调用真正的构造函数(无参数)。
关于c# - Select 不适用于 IQueryable 但适用于 IList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6245298/