Подтвердить что ты не робот

Передача func как параметра в Linq to Entities и ошибка "Ошибка поставщика данных .NET Framework 1025"

У нас есть класс Task:

public partial class Task : EntityObject
{
    public EntityCollection<TaskUser> TaskUsers { get {...} set{...} } 
}

У этого есть свойство навигации, называемое TaskUsers, которое содержит пользователей, прикрепленных к этим taks:

public partial class TaskUser : EntityObject
{
    public User User { get {...} set {  } }
}

Каждый объект TaskUser имеет объект User.

Нам дано IQueryable<Task> tasks. Мы хотим найти задачи, назначенные пользователю с ID = 1. Когда мы используем

tasks.Where(t => t.TaskUsers.Any(a => a.User.ID == 1))

все работает нормально. Когда мы используем

Func<TaskUser, bool> function = a => a.User.ID == 1;
return tasks.Where(t => t.TaskUsers.Any(function));

получаем приятную ошибку 'Internal .NET Framework Data Provider error 1025'. Зачем? Я хочу создать гораздо более сложные фильтры с помощью класса Expression, но если я не могу пройти простую Func, это невозможно. Что мне делать?

ИЗМЕНИТЬ

Возможно

Func<TaskUser, bool> function = a => a.User.ID == 1;
return tasks.Where(t => t.TaskUsers.Any(function));

не работает, но

Expression<Func<TaskUser, bool>> expression = a => a.User.ID == 1;
return tasks.Where(t => t.TaskUsers.AsQueryable().Any(expression));

работает! Это все, что мне нужно.

4b9b3361

Ответ 1

Ну, EF может только переводить выражения, а не функции.

то есть. он может перевести это:

Expression<Func<TaskUser,bool>> 

но не это:

Func<TaskUser,bool>

Как объединить выражения (в псевдокоде):

Expression<Func<TaskUser, bool>> expression = a => a.User.ID == 1;
return tasks.Where(t => t.TaskUsers.Any(expression));

Есть, вероятно, какой-то Гуру экспрессии, который может помочь с этим.

Я предлагаю следующий вопрос, посвященный этой конкретной проблеме.

Алекс