如何在linq中为实体框架::
的实体执行以下操作public static Expression<Func<T, bool>> IsOk<T>(long? entityId)
{
return x => (!entityId.HasValue || entityId.Value == x.GetEntityId());
}
x.GetEntityId()
返回异常,因为它无法识别方法。
答案 0 :(得分:1)
我建议您的类型参数仅限于IMyExpectation
等自定义界面,其中包含
interface IMyExpectation {
int GetEntityId();
}
然后将方法的类型参数约束到该接口。 (现在这将编译为GetEntityId
方法。)
public static Expression<Func<T, bool>> IsOk<T>(long? entityId)
where T: IMyExpectation // << restrict the type to what is needed
{
return new Func<T, bool>(
x => !entityId.HasValue || entityId.Value == x.GetEntityId()
);
}
然后在实体框架类上实现您需要它的接口,但在单独的文件中的partial
部分上,因此模型不会在重新生成模型时删除自定义代码。例如
在您的EF模型实体上
注意:这取决于Aliostad's answer。
public partial class Customer : IMyExpectation { //...
public partial class Invoice : IMyExpectation { //....
// etc
或者,在您的POCO上
注意:如果不受EF类
public class CustomerPoco: IMyExpectation { //...
public class InvoicePoco : IMyExpectation { //...
现在你的实体和类(以及任何你实施的'IMyExpectation'都在表达自己就像你原来的方法一样。) 最后,您的方法将理解您已实现接口的任何这些内容,因此它们都是通过其类型参数传递给方法的候选者。
如果你的答案是正确的,那么这应该很好地包装好。
答案 1 :(得分:0)
您不能 - 您的数据库无法运行GetEntityId()
(因为它不理解它)因此您的Linq提供程序无法翻译它。
那你怎么解决呢?
GetEntityId()
中有逻辑),则需要在客户端完成:返回所有行并随后在C#中进行过滤。当然,不用说你的表现会怎样。