Передача func в качестве параметра в Linq сущностям и ошибка «Внутренняя ошибка. Data Framework 1025» - PullRequest
18 голосов
/ 11 ноября 2009

У нас есть класс с именем 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, это невозможно сделать. Что мне делать?

EDIT

Может быть

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));

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

1 Ответ

26 голосов
/ 11 ноября 2009

Ну, 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));

Возможно, есть некоторые гуру Выражения, которые могут помочь с этим.

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

Alex

...