c# - Select 不适用于 IQueryable 但适用于 IList

标签 c# .net linq subsonic subsonic-simplerepository

我有两行代码,一行是

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/

相关文章:

c# - 在 C# 中使用 LINQ 查找分组列表的组合

c# - Linq 查询不向 Datagridview 返回任何数据(linq 查询可能失败)C#

c# - 找不到某些 Boost 库函数

c# - 如何在 Xamarin Forms 中复制 iOS 开关的功能,使其在 iOS 和 Android 中看起来相同?

ASP.NET WebAPI 将 urlencoded 正文中的空字符串作为 null 传递

.net - 为什么 PrintServer.GetPrintQueues 没有获得正确的 PrintTicket,而 PrintServer.GetPrintQueue 却获得了正确的 PrintTicket?

c# - Entity Framework 中不同表的抽象操作

c# - FileSystemWatcher OnCreated 仅针对复制的多个文件中的第一个文件触发

.net - 如何将介绍的 ML.Net 演示翻译成 F#?

c# - Linq 刚刚开始