Он жалуется (разумно), что не может превратить вызов SelectEvent
в SQL.
Если вы поставите .AsEnumerable()
до того, как .Select()
C # будет использовать IEnumerable Select поверх IQueryable Select:
interface IEnumerable<T> {
...
// Actually, these are extension methods in Enumerable and Queryable.
IEnumerable<T> Select<TResult>(Func<T, TResult> selector);
...
}
interface IQueryable<T> : IEnumerable<T> {
...
IQueryable<T> Select<TResult>(Expression<Func<T, TResult>> selector);
...
IEnumerable<T> AsEnumerable();
}
IEnumerable<IEvent> events = db.getEvents().AsEnumerable().Select(x => SelectEvent(x, null));
Или, если вы могли бы немедленно использовать перегрузку IEvent SelectEvent(SqlServer.Event)
, поскольку она не может быть преобразована в выражение <>:
IEnumerable<IEvent> events = db.getEvents().Select(SelectEvent);
IEnumerable Select выполняет селектор Func<T, TResult>
один раз для каждого элемента, возвращаемого из исходного IEnumerable, IQueryable Select передает селектор Expression<Func<T, TResult>>
поставщику LINQ, который в случае LINQ2SQL пытается сгенерировать эквивалентный SQL.