将func作为Linq中的参数传递给实体和“内部.NET Framework数据提供程序错误1025”错误

时间:2009-11-10 21:45:01

标签: entity-framework linq-to-entities lambda

我们有一个名为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));

作品!这就是我所需要的一切。

1 个答案:

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

可能有一些表达大师可以提供帮助。

我建议关注该特定问题的后续问题

亚历