В общем, если я создаю метод расширения, который действует на объект:
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();
Я бы закончил тем, что выбирал ВСЕ сущности, а потом брал верхнюю и отбрасывал остальные - что было бы ужасно для производительности.