MethodInfo для EntityCollection вместо Queryable

Я вручную создаю эквивалентную лямбду:

var function = p => p.Child.Any(c => c.Field == "value");

У меня есть ссылка MethodInfo на метод «Any», используемый со встроенным кодом Expressions.

MethodInfo method = typeof(Queryable).GetMethods()
        .Where(m => m.Name == "Any" && m.GetParameters().Length == 2)
        .Single().MakeGenericMethod(typeof(Child));

Мои сущности: Родитель 1 --- * Ребенок

Дочерний элемент - это свойство навигации для родительского элемента (p в приведенной выше лямбде). Тип свойства - EntityCollection, созданный дизайнером.

Я искал правильный способ ссылки на метод Any для создания этого вызова. Марк дал мне ответ, как это получить: Вызов метода из выражения

Но это не работает для фреймворка сущностей. EntityCollection не реализует IQueryable, поэтому как следует ссылаться на метод Any.


person blu    schedule 14.01.2009    source источник


Ответы (2)


EntityCollection<T> не реализует IQueryable<T>, поэтому неудивительно, что это не работает, ИМО.

Не могли бы вы дать более подробное объяснение того, что вы пытаетесь сделать? Если вы ожидаете, что запрос будет запущен в базе данных, я предполагаю, что он действительно не будет поддерживать это (учитывая, что EntityCollection<T> не реализует IQueryable<T>). Если вы хотите, чтобы запрос выполнялся локально, вы должны использовать Enumerable.Any вместо Queryably.Any.

РЕДАКТИРОВАТЬ: увидев обновленную коллекцию, я считаю, что вам просто нужен Enumerable.Any вместо Queryable.Any. Не забывайте, что если это предоставляется в виде дерева выражений, вы все равно не будете выполнять этот код. Предположительно фреймворк понимает Enumerable.Any применительно к EntityCollection<T>

person Jon Skeet    schedule 14.01.2009
comment
Мой ответ был слишком большим для комментария, пожалуйста, смотрите мой ответ ниже. - person blu; 14.01.2009
comment
Пожалуйста, отредактируйте вопрос, чтобы прояснить его, вместо того, чтобы добавлять ответ без ответа. - person Jon Skeet; 14.01.2009
comment
Я обновил исходный вопрос с уточнениями, спасибо - person blu; 14.01.2009

Вы можете преобразовать EntityCollection в IQueryable с помощью метода расширения AsQueryable ().

person Community    schedule 03.08.2009