Проблемы с размещением оператора Lambda в запросе LINQ - PullRequest
2 голосов
/ 16 июля 2010

Я пытаюсь внедрить некоторую встроенную работу в качестве лямбда-оператора в запрос LINQ select вот так ...

// NOTE: mcontext.Gettype() == System.Data.Linq.DataContext

// Okay - compiles, nothing unusual
var qPeople1 = from ME.tblPeople person in mcontext.tblPeoples
              select person;

// ERROR - see below compile Error - Can I retrofit this thing?
var qPeople2 = from ME.tblPeople person in mcontext.tblPeoples
               select (() => { 
                   return person; 
               })();

Ошибка:

Ошибка 2 Название метода Ожидаемый файл .cs 166 27 MigrationCore

... однако я также был бы рад, если бы сначала работала Expression Lambda.

Примечание : Я знаю, что пример кода избыточен в своих усилиях, но я ищу основную концепцию. Если это будет работать, я буду расширять его.

Ответы [ 2 ]

5 голосов
/ 16 июля 2010

Синтаксис запроса требует ссылки на метод - он не будет принимать лямбду, и во втором примере вы даете ему экземпляр ME.tblPeople.

Однако, если вы используете синтаксис метода расширения, вы можетедостичь этого легко:

int i = 0;
var qPeople3 = (from ME.tblPeople person in mcontext.tblPeoples
                select person).Select(person => { i += 1; return person; });

(я добавил в качестве примера целое число приращения, хотя учтите, что оно фактически не меняется с нуля, пока вы не перечислите qPeople3.)

Приложение

Это работает только с LINQ to Objects.Чтобы использовать его с запросом LINQ to SQL, перед вызовом Select() требуется вызов AsEnumerable().

Примечания

На самом деле вам не нужен from-in-select Для этого примера приведенные ниже фрагменты (AFAICT) идентичны, но я оставил их выше для сходства с предыдущими примерами и для иллюстрации того, как это работает.Второй фрагмент разбивает два оператора на отдельные строки, также с одинаковыми результатами.

int i = 0;
var qPeople4 = mcontext.tblPeoples.Select<ME.tblPeople,ME.tblPeople>(person => { i += 1; return person; });
int i = 0;
var qPeople1 = from ME.tblPeople person in mcontext.tblPeoples
               select person;
var qPeople5 = qPeople1.Select(person => { i += 1; return person; });
4 голосов
/ 16 июля 2010

Существует два вида лямбда-выражений: анонимные делегаты и деревья выражений.Первый тип используется LINQ to Objects и допускает любое допустимое тело анонимного метода.Последний тип используется LINQ to SQL и требует, чтобы его тело было единым выражением.Затем это выражение передается в среду выполнения L2SQL и обрабатывается в SQL, отправляемом на сервер.

Для выполнения встроенной работы вам потребуется выполнить два шага: 1) получить данные SQL с допустимым значением selectвыражение, затем 2) манипулировать этими данными как IEnumerable <> с помощью LINQ to Objects для выполнения встроенной работы.Это может выглядеть примерно так:

var qPeople1 = from ME.tblPeople person in mcontext.tblPeoples
              select person;

var i = 0;
var qPeople2 = qPeople1.AsEnumerable().Select(person => {
                   i += 1;
                   return person; 
               });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...