我已经阅读了大约 30 个 Stack Overflow 问题和大约 20 个博客,但找不到我的答案。也就是说,我确信我需要的答案就在那里,所以如果你知道,请指出(请注意最后一段/句子关于不符合我要求的答案)。谢谢!
我正在持久化具有类似于以下形状的类的实例:
public class Data {
public int Id { get; set; }
}
public class Container {
public int Id { get; set; }
public Data Data { get; set; }
}
目前,编写查询以通过抽象层查找容器,该抽象层需要接受容器并返回 bool(谓词)的 Lambda 表达式。即使 Entity Framework 5 是选择的 ORM,它也不会接受 IQueryable。
我的任务是呈现一个基于接受数据类型的 Lambda 表达式的 API 界面。我无法更改抽象层(我必须传递一个接受容器的谓词),所以我试图将收到的表达式转换为:
Expression<Func<Data , bool>>
to:
Expression<Func<Container , bool>>
我在我的存储库类中添加了一个额外的方法,如下所示:
public Container Find( Expression<Func<Data , bool>> predicate ) {
IEnumerable<Container> result = QueryStrategy.Fetch( c => predicate.Compile().Invoke( c.Data ) );
return result.FirstOrDefault();
}
这补充了现有的 Find 方法:
public Container Find( Expression<Func<Container , bool>> predicate ) {
IEnumerable<Container> result = QueryStrategy.Fetch( predicate );
return result.FirstOrDefault();
}
当使用前一种方法时,它会产生以下异常:
LINQ to Entities 无法识别方法 'Boolean Invoke(Container.Data)' 方法,并且此方法无法转换为存储表达式。
我已经用 Expression 类尝试了各种各样的东西,我只是看不到映射的方法:
Expression<Func<Data , bool>>
to:
Expression<Func<Container , bool>>
不使用 Entity Framework 不支持的 Invoke (但在内存中可枚举的数据中可以正常工作)。
任何人都可以帮助我使用表达式来实现上述场景吗?
我知道我也许可以使用 LinqKit 库来解决这个问题,但我真的很想在不引入第三方库的情况下解决这个问题。
更新:为了提出一个简化的问题,我已经暗示(通过最初在代码示例中使用 DbContext)代码可以访问 IQueryable 和/或适合使用 LinqKit 的 AsExpandable()。实际上情况并非如此——存储库类不允许使用 IQueryable 或任何供应商特定的扩展。我已经修改了上面的例子,希望这能让事情变得更清楚。
此问题现已解决