Как вызвать пользовательский метод в лямбда-выражении.Я использую Entity Framework 4.Хранимая ошибка выражения - PullRequest
1 голос
/ 15 сентября 2010

Можно ли вызывать пользовательский метод в лямбда-выражении .?

//Address a : It's an Entity
public string AddressConstructor(Address a)
{
    return a.City + "," + a.Province;
}



var Test = _db.MyTableTest.Select( t => new ViewModel
                                   {
                                      MyID = t.ID,
                                      StringAddress = AddressConstructor(t.Addr)
                                   };

Ответы [ 2 ]

3 голосов
/ 15 сентября 2010

Вы сможете выполнить это, используя LINQKit для встраивания своего выражения в дерево выражений.

http://www.albahari.com/nutshell/linqkit.aspx

Это приведет к тому, что конкатенация, которую вы пытаетесь запустить наSQL Server, а не в памяти (как описано в другом ответе).Конечно, SQL Server знает, как объединять строки, но если ваш AddressConstructor сделал что-то еще, чего не понимает SQL Server, то этот подход не сработает, и вам действительно нужно будет выполнить свой пользовательский метод в памяти, используя подход, описанный в другомответ.

По существу, LINQKit сгладит дерево, чтобы оно фактически выполнялось как:

    var Test = _db.MyTableTest.Select( t => new ViewModel
 {
      MyID = t.ID,
      StringAddress = t.Addr.City + "," + t.Addr.Province
 };

, который EF не должен иметь проблем при выполнении (и конкатенация должна происходить на SQL Server).

1 голос
/ 15 сентября 2010

Вам необходимо вызвать AsEnumerable, чтобы проекция выполнялась локально:

var Test = _db.MyTableTest.AsEnumerable()
                          .Select( t => new ViewModel
                                   {
                                      MyID = t.ID,
                                      StringAddress = AddressConstructor(t.Addr)
                                   };

В противном случае вместо Enumerable.Select используется метод Queryable.Select, что заставляет Entity Framework пытаться перевестилямбда-выражение для SQL-запроса (что, конечно, невозможно в этом случае)

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