我们有一个名为Task的课程:
public partial class Task : EntityObject
{
public EntityCollection<TaskUser> TaskUsers { get {...} set{...} }
}
它有一个名为TaskUsers的导航属性,其中包含附加到此目标的用户:
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));
作品!这就是我所需要的一切。
答案 0 :(得分:26)
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));
可能有一些表达大师可以提供帮助。
我建议关注该特定问题的后续问题
亚历