【问题标题】:Linq error when using let使用 let 时出现 Linq 错误
【发布时间】:2014-10-09 10:19:28
【问题描述】:

我有以下 linq 查询,它给出以下错误:查询正文必须以 select 子句或 group 子句结尾

from sdc in ScheduleDestinationCaches
let twins = from gt in GetTwins(72)
join ssFilter in ScheduleStops on sdc.CarrierID equals ssFilter.CarrierID
join ssLookup in ScheduleStops on sdc.CityID equals ssLookup.CityID
join sc in ScheduleCarriers on ssLookup.CarrierID equals sc.CarrierID
where twins.Contains(ssFilter.StopID ) || ssFilter.StopID == 72
select sc

有什么想法吗?

顺便说一句,我正在使用 linqpad

【问题讨论】:

  • 请出示GetTwins(72)
  • 来自 MSDN:msdn.microsoft.com/en-us/library/bb383976.aspx 看起来您在 let 原因之后缺少第二个 from 子句。是的,我意识到它是针对 C# 语法的,但在这种情况下,除了末尾的分号之外,它基本上是相同的。
  • 它抱怨from gt in GetTwins(72) 没有选择。
  • GetTwins 是用户定义的函数

标签: linq let


【解决方案1】:

让我们添加一些缩进:

from sdc in ScheduleDestinationCaches
let twins = from gt in GetTwins(72)
            join ssFilter in ScheduleStops on sdc.CarrierID equals ssFilter.CarrierID
            join ssLookup in ScheduleStops on sdc.CityID equals ssLookup.CityID
            join sc in ScheduleCarriers on ssLookup.CarrierID equals sc.CarrierID
            where twins.Contains(ssFilter.StopID ) || ssFilter.StopID == 72
            select sc

您现在可以看到问题了吗?添加from 作为对let 定义变量的赋值会启动新的LINQ 表达式,该表达式以select sc 结尾。这使得外部查询根本没有select 子句!

我想你正在寻找

from sdc in ScheduleDestinationCaches
let twins = GetTwins(72)
join ssFilter in ScheduleStops on sdc.CarrierID equals ssFilter.CarrierID
join ssLookup in ScheduleStops on sdc.CityID equals ssLookup.CityID
join sc in ScheduleCarriers on ssLookup.CarrierID equals sc.CarrierID
where twins.Contains(ssFilter.StopID ) || ssFilter.StopID == 72
select sc

基于评论的更新

from sdc in ScheduleDestinationCaches
let twins = GetTwins(72).Select(x => x.Id)
join ssFilter in ScheduleStops on sdc.CarrierID equals ssFilter.CarrierID
join ssLookup in ScheduleStops on sdc.CityID equals ssLookup.CityID
join sc in ScheduleCarriers on ssLookup.CarrierID equals sc.CarrierID
where twins.Contains(ssFilter.StopID ) || ssFilter.StopID == 72
select sc

【讨论】:

  • 谢谢。我可以看到并理解其中的区别。现在我得到一个不同的错误:'System.Linq.IQueryable'不包含'Contains'的定义和最佳扩展方法重载'System.Linq.ParallelEnumerable.Contains( System.Linq.ParallelQuery, TSource)' 有一些无效参数 实例参数:无法从 'System.Linq.IQueryable' 转换为 'System.Linq.ParallelQuery'
  • 这是因为GetTwins 返回了一个对象集合,而您正试图检查它是否包含int 值。那是行不通的。
  • 有道理。如何模拟选择输入?
  • GetTwins 之后添加Select(x => x.Id)(或任何属性名称)调用。
猜你喜欢
  • 1970-01-01
  • 2021-12-04
  • 2013-11-11
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多