Как вы повторно используете операторы select с Entity Framework? - PullRequest
3 голосов
/ 02 августа 2010

Учитывая следующий запрос:

var query = from item in context.Users // Users if of type TblUser
            select new User()          // User is the domain class model
            {
                ID = item.Username,
                Username = item.Username
            };

Как я могу повторно использовать часть выбора оператора в других запросах?Т.е.

var query = from item in context.Jobs  // Jobs if of type TblJob
            select new Job()           // Job is the domain class model
            {
                ID = item.JobId,
                User = ReuseAboveSelectStatement(item.User);
            };

Я пытался просто использовать метод сопоставления:

public User MapUser(TblUser item)
{
   return item == null ? null : new User()
   {
      ID = item.UserId,
      Username = item.Username
   };
}

С:

var query = from item in context.Users // Users if of type TblUser
            select MapUser(item);

Но если я делаю это, то фреймворк выдает ошибкунапример:

LINQ to Entities не распознает метод метода MapUser (TblUser), и этот метод нельзя преобразовать в выражение хранилища.

Ответы [ 2 ]

1 голос
/ 03 августа 2010

Нельзя использовать обычные вызовы функций в таком определении запроса.LINQ нужны деревья выражений, он не может анализировать скомпилированные функции и волшебным образом переводить их в SQL. Прочитайте это для более подробного объяснения

Методы, использованные в цитируемой статье, включены в linqkit (исключая предикаты) и могут помочь, хотя я 'Я не уверен, что вы можете использовать ту же технику для управления проекциями, а это то, что вам кажется.

Более фундаментальный вопрос, который вы должны задать себе здесь, ИМХО, действительно ли вам нужен этот дополнительный слой отображения?Похоже, вы реализуете что-то, что EF уже вполне может сделать для вас ...

0 голосов
/ 02 августа 2010

Попробуйте сделать свой MapUser метод static.

...