【问题标题】:Linq error - "NotSupportedException: Unsupported overload used for query operator 'Select'"Linq 错误 - “NotSupportedException:不支持的重载用于查询运算符 'Select'”
【发布时间】:2010-07-07 12:29:00
【问题描述】:

我有以下 Linq 查询:

var tmp = 
    from container in Container
    join containerType in ContainerType on container.ContainerType equals containerType
    where containerType.ContainerTypeID == 2
    select new { ContainerID = container.ContainerID, TypeID = container.ContainerTypeID};

var results = tmp.Select((row, index) => new { row.ContainerID, row.TypeID, ContainerIndex = index })

按原样,这很好用。如果我添加以下内容,以便在 LinqPad 中看到结果,则会收到此消息标题中描述的错误:

results.Dump();

这个错误不是 LinqPad 错误,它来自 Linq,我不明白它是什么意思。

谢谢。

【问题讨论】:

  • 另请参阅我对 Jon 对您上一个问题的回答的评论。

标签: linq


【解决方案1】:

好吧,我没有意识到 Container 是一个 LINQ to SQL 数据源。基本上它无法将第二个投影转换为 SQL。

所以,您只想在 .NET 中执行该操作 - 您可以强制它使用 Enumerable.SelectAsEnumerable

var results = tmp.AsEnumerable()
                 .Select((row, index) => new { row.ContainerID, row.TypeID,
                                               ContainerIndex = index });

【讨论】:

  • 对不起,我应该提到这一点。感谢您的帮助。
  • 我也遇到了同样的问题,使用.AsEnumerable() 也可以。 +1。但为什么它有效?为什么从 System.Data.Linq.Table<MyObject> 我无法迭代/选择新对象?
  • @markzzz:这是投影发生位置的问题。虽然它是可查询的,但您要求将您正在做的任何事情转换为 SQL……而在您使用 AsEnumerable 之后,这意味着一切都在本地完成。
  • 但是为什么把它翻译成AsEnumerable() 可以完成任务而没有它就不能呢?这一点都不清楚……
  • @markzzz:关键是你要求的东西不能被翻译成 SQL,所以当你尝试这样做时它会失败......而如果你说“我会做本地投影”然后就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
相关资源
最近更新 更多