Невозможно перевести на SQL с помощью Select (x => Func (x)) - PullRequest
2 голосов
/ 01 апреля 2010

Я медленно изучаю все тонкости LINQtoSQL, но меня это смущает.

Вот мое утверждение:

IQueryable<IEvent> events = (from e in db.getEvents()
                            select e).Select(x => SelectEvent(x, null));

Что делает SelectEvent, можно объяснить в этом ответе здесь . Я не использую функцию .toList (), так как я не хочу, чтобы потенциально тысячи записей вносились в память.

public IEvent SelectEvent(SqlServer.Event ev, EventType? type) {
    // Create an object which implements IEvent
    // I don't have the code in front of me, so forgive the lack of code
}

Мой вопрос действительно относится к методу Select(). Я получаю сообщение об ошибке «Не удается перевести на SQL», и в сообщении об ошибке указан Select().

Не знаю, на этом: - /.

Ответы [ 3 ]

3 голосов
/ 01 апреля 2010

Он жалуется (разумно), что не может превратить вызов 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.

3 голосов
/ 01 апреля 2010

Linq to SQL не может переводить произвольные вызовы функций, подобные этому, в SQL. Он понятия не имеет, что делает функция. Вы должны будете сконструировать все, что SelectEvent делает, используя выражения.

В качестве альтернативы, если все, что вы хотите сделать, это сопоставить объекты с чем-то другим после того, как запрос прошел через базу данных, просто сделайте это, пока вы просматриваете результаты, или создайте генератор обертывания, который сделает это за вас.

2 голосов
/ 01 апреля 2010

Проблема здесь в том, что в LinqToSQL ваш запрос сначала транслируется в дерево выражений, а затем - в реально работающий код SQL. Существует только небольшое подмножество кода C # в форме дерева выражений, которое можно преобразовать в SQL.

В этом случае дерево выражений включает в себя вызов метода, который находится в текущей сборке (SelectEvent). Преобразование не может преобразовать этот метод в код, который может выполняться на сервере SQL, поэтому он выдает ошибку.

Чтобы обойти это, попробуйте вставить код для SelectEvent в выражение запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...