Можно ли расширить LINQ-To-Entities? - PullRequest
3 голосов
/ 10 декабря 2011

В общем, если я создаю метод расширения, который действует на объект:

public static MyEntity Foo(this MyEntity entity)
{
  // do something to the entity
}

Нельзя напрямую использовать это в проекции от Linq-To-Entities, например:

var result = myContext.MyEntities.Select(x=> x.Foo());

Это приводит к ошибке, такой как:

System.NotSupportedException: LINQ to Entities не распознает метод Foo (MyEntity), и этот метод не может быть переведен в магазинное выражение.

Я полностью понимаю, почему возникает эта ошибка. У меня такой вопрос: если я могу предоставить реализацию Foo, которая использует дерево выражений, есть ли способ добавить Foo к операциям, которые понимает LINQ-to-entity? И если так - как?


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

var result = myContext.MyEntities.ToList().Select(x=> x.Foo());

И это не ошибка. Но у меня больше нет IQueryable. У меня есть IEnumerable. Если бы я использовал это так:

var result = myContext.MyEntities.ToList().Select(x=> x.Foo()).First();

Я бы закончил тем, что выбирал ВСЕ сущности, а потом брал верхнюю и отбрасывал остальные - что было бы ужасно для производительности.

1 Ответ

2 голосов
/ 13 декабря 2011

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

...