При выборе анонимного типа с помощью LINQ из EF, нет ли способа запустить метод на объекте при его выборе? - PullRequest
4 голосов
/ 10 ноября 2009

Допустим, у меня есть метод:

bool myMethod(int a)
{
//return a bool
}

Так скажем, я следующее

// assume a has prop1 and prop2 both ints
var mySelection = from a in myContainer 
                  where a=somecondition 
                  select new {
                         a.prop1,
                         myMethod(a.prop2)
                     };

Неужели нет способа запустить myMethod в объявлении анонимного типа? Есть ли какая-то хитрость?

Могу ли я добавить туда анонимный метод для возврата эквивалента myMethod (a.prop2)?

Ответы [ 2 ]

11 голосов
/ 10 ноября 2009

Хорошо, давайте разделим это на LINQ to Objects и LINQ to Entities

В LINQ to Object вышеприведенный сбой, потому что компилятор не знает, что такое имя свойства, если вы измените его на следующее:

var mySelection = from a in myContainer
                  where a=somecondition 
                  select new {
                         a.prop1,
                         prop2 = myMethod(a.prop2)
                     };

Это будет работать в LINQ to Objects

Однако Entity Framework не сможет преобразовать вызов метода (если только это не функция, известная EF, например, определяемая моделью функция, EdmMethods или SqlMethods), поэтому вам придется переписать этот запрос следующим образом:

var mySelection = from a in myContainer
                  where a=somecondition 
                  select new {
                         a.prop1,
                         a.prop2
                     };

var myResults = from a in mySelection.AsEnumerable()
                select new {a.prop1, prop2 = myMethod(a.prop2)};

Это извлекает из базы данных все, что вам нужно, и затем использование вызова AsEnumerable () превращает вызов myMethod в нечто, обрабатываемое LINQ to Objects, а не LINQ to Entities

Надеюсь, это поможет

Alex

1 голос
/ 10 ноября 2009

Я не думаю, что есть способ вызвать метод от анонимного инициализатора. Даже если бы он был, он, вероятно, не очень хорошо работал бы.

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

...