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

Luk*_*Led 18 lambda linq-to-entities entity-framework

我们有一个名为Task的类:

public partial class Task : EntityObject
{
    public EntityCollection<TaskUser> TaskUsers { get {...} set{...} } 
}
Run Code Online (Sandbox Code Playgroud)

它有一个名为TaskUsers的导航属性,其中包含附加到此taks的用户:

public partial class TaskUser : EntityObject
{
    public User User { get {...} set {  } }
}
Run Code Online (Sandbox Code Playgroud)

每个TaskUser对象都有User对象.

我们得到了IQueryable<Task> tasks.我们希望找到分配给ID = 1的用户的任务.当我们使用时

tasks.Where(t => t.TaskUsers.Any(a => a.User.ID == 1))
Run Code Online (Sandbox Code Playgroud)

一切正常.当我们使用

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

我们得到了很好的'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));
Run Code Online (Sandbox Code Playgroud)

不起作用,但是

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

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

Ale*_*mes 26

那么EF只能翻译表达式,而不能翻译函数.

即它可以翻译这个:

Expression<Func<TaskUser,bool>> 
Run Code Online (Sandbox Code Playgroud)

但不是这个:

Func<TaskUser,bool>
Run Code Online (Sandbox Code Playgroud)

至于如何合并表达式(伪代码):

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

可能有一些表达大师可以帮助解决这个问题.

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

亚历克斯

  • 没有大师的帮助:return tasks.Where(t => t.TaskUsers.AsQueryable().Any(expression)); (12认同)