0

I have the following linq query and it is giving the following error: A query body must end with a select clause or a group clause

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

any ideas?

By the way I'm using linqpad

user1286550
  • 101
  • 1
  • 6

1 Answers1

0

Let's add some indentation:

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

Can you see the issue now? Adding from as an assignment to let-defined variable starts new LINQ expression, which end with select sc. This makes the outer query not to have select clause at all!

I think you're looking for

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

Comments-based update

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
MarcinJuraszek
  • 124,003
  • 15
  • 196
  • 263
  • Thank you. I can see and understand the difference. Now I'm getting a different error: 'System.Linq.IQueryable' does not contain a definition for 'Contains' and the best extension method overload 'System.Linq.ParallelEnumerable.Contains(System.Linq.ParallelQuery, TSource)' has some invalid arguments Instance argument: cannot convert from 'System.Linq.IQueryable' to 'System.Linq.ParallelQuery' – user1286550 Aug 15 '14 at 17:09
  • That's because `GetTwins` returns a collection of objects, and you're trying to check if it contains an `int` value. That will not work. – MarcinJuraszek Aug 15 '14 at 17:23
  • That make sense. How can I emulate a select in? – user1286550 Aug 15 '14 at 17:26
  • Add `Select(x => x.Id)` (or whatever the property name is) call after `GetTwins`. – MarcinJuraszek Aug 15 '14 at 17:27