C# 实体框架泛型谓词
我需要在4-5个差异实体集上共享谓词,最好不要重复代码。所有实体都实现接口C# 实体框架泛型谓词,c#,.net,linq,entity-framework,C#,.net,Linq,Entity Framework,我需要在4-5个差异实体集上共享谓词,最好不要重复代码。所有实体都实现接口IEntity private Expression<Func<T, bool>> GetUpdatedPredicate<T>(DateTime? lastUpdated) where T : IEntity { if (lastUpdated.HasValue) { return x => ( x.CreatedAt >=
IEntity
private Expression<Func<T, bool>> GetUpdatedPredicate<T>(DateTime? lastUpdated) where T : IEntity {
if (lastUpdated.HasValue) {
return x => (
x.CreatedAt >= lastUpdated ||
(x.UpdatedAt.HasValue && x.UpdatedAt >= lastUpdated)
);
}
return x => true;
}
私有表达式GetUpdatedPredicate(DateTime?lastUpdated),其中T:Entity{
if(lastUpdated.HasValue){
返回x=>(
x、 CreatedAt>=上次更新||
(x.UpdatedAt.HasValue&&x.UpdatedAt>=lastUpdated)
);
}
返回x=>true;
}
然后像这样跨多个实体集使用:
(
from s in Db.EntityA.Where(GetUpdatedPredicate<EntityA>(lastUpdated))
where (
s.User.Id == 1
)
select s
).Future();
(
从Db.EntityA.Where中的s(GetUpdatedPredicate(LastUpdate))
在哪里(
s、 User.Id==1
)
选择s
).Future();
但给出了错误:
无法将类型“EntityA”强制转换为类型“ienty”。LINQ to实体仅支持强制转换EDM基元或枚举类型。有没有一种方法可以在不重复代码的情况下做到这一点?我建议另一种方法 首先,您将拥有一个私有静态方法,而不是返回表达式的方法,如:
private static bool Evaluate(IEntity x, DateTime? lastUpdated) {
if (lastUpdated.HasValue) {
return x.CreatedAt >= lastUpdated ||
(x.UpdatedAt.HasValue && x.UpdatedAt >= lastUpdated)
);
}
return true;
}
显然,你可以更好地命名这个词。然后像这样使用它:
var result = Db.EntityA.Where(i => i.Evaluate(i, lastUpdated));
我建议另一种方法 首先,您将拥有一个私有静态方法,而不是返回表达式的方法,如:
private static bool Evaluate(IEntity x, DateTime? lastUpdated) {
if (lastUpdated.HasValue) {
return x.CreatedAt >= lastUpdated ||
(x.UpdatedAt.HasValue && x.UpdatedAt >= lastUpdated)
);
}
return true;
}
显然,你可以更好地命名这个词。然后像这样使用它:
var result = Db.EntityA.Where(i => i.Evaluate(i, lastUpdated));
我建议另一种方法 首先,您将拥有一个私有静态方法,而不是返回表达式的方法,如:
private static bool Evaluate(IEntity x, DateTime? lastUpdated) {
if (lastUpdated.HasValue) {
return x.CreatedAt >= lastUpdated ||
(x.UpdatedAt.HasValue && x.UpdatedAt >= lastUpdated)
);
}
return true;
}
显然,你可以更好地命名这个词。然后像这样使用它:
var result = Db.EntityA.Where(i => i.Evaluate(i, lastUpdated));
我建议另一种方法 首先,您将拥有一个私有静态方法,而不是返回表达式的方法,如:
private static bool Evaluate(IEntity x, DateTime? lastUpdated) {
if (lastUpdated.HasValue) {
return x.CreatedAt >= lastUpdated ||
(x.UpdatedAt.HasValue && x.UpdatedAt >= lastUpdated)
);
}
return true;
}
显然,你可以更好地命名这个词。然后像这样使用它:
var result = Db.EntityA.Where(i => i.Evaluate(i, lastUpdated));
EF现在尝试将对方法的调用包含到生成的表达式中,但这不会起作用。必须从表达式中排除方法调用 在定义查询之前,尝试从方法创建表达式(不,我还没有测试它)
DateTime lastUpdated=。。。;
var updatedPredicate=GetUpdatedPredicate(lastUpdated);
变量查询=
(
从Db.EntityA.Where中的s(updatedPredicate)
在哪里(
s、 User.Id==1
)
选择s
).Future();
EF现在尝试将对方法的调用包含到生成的表达式中,但这不会起作用。必须从表达式中排除方法调用
在定义查询之前,尝试从方法创建表达式(不,我还没有测试它)
DateTime lastUpdated=。。。;
var updatedPredicate=GetUpdatedPredicate(lastUpdated);
变量查询=
(
从Db.EntityA.Where中的s(updatedPredicate)
在哪里(
s、 User.Id==1
)
选择s
).Future();
EF现在尝试将对方法的调用包含到生成的表达式中,但这不会起作用。必须从表达式中排除方法调用
在定义查询之前,尝试从方法创建表达式(不,我还没有测试它)
DateTime lastUpdated=。。。;
var updatedPredicate=GetUpdatedPredicate(lastUpdated);
变量查询=
(
从Db.EntityA.Where中的s(updatedPredicate)
在哪里(
s、 User.Id==1
)
选择s
).Future();
EF现在尝试将对方法的调用包含到生成的表达式中,但这不会起作用。必须从表达式中排除方法调用
在定义查询之前,尝试从方法创建表达式(不,我还没有测试它)
DateTime lastUpdated=。。。;
var updatedPredicate=GetUpdatedPredicate(lastUpdated);
变量查询=
(
从Db.EntityA.Where中的s(updatedPredicate)
在哪里(
s、 User.Id==1
)
选择s
).Future();
实体框架与您的接口类型约束存在问题:
where T : IEntity
您需要添加一个额外的约束,T需要是一个类:
where T : class, IEntity
另外,如果您开始发现LINQ表达式,我可以强烈推荐该库。它有一些非常非常漂亮的东西。实体框架在这里与您的接口类型约束有问题:
where T : IEntity
您需要添加一个额外的约束,T需要是一个类:
where T : class, IEntity
另外,如果您开始发现LINQ表达式,我可以强烈推荐该库。它有一些非常非常漂亮的东西。实体框架在这里与您的接口类型约束有问题:
where T : IEntity
您需要添加一个额外的约束,T需要是一个类:
where T : class, IEntity
另外,如果您开始发现LINQ表达式,我可以强烈推荐该库。它有一些非常非常漂亮的东西。实体框架在这里与您的接口类型约束有问题:
where T : IEntity
您需要添加一个额外的约束,T需要是一个类:
where T : class, IEntity
另外,如果您开始发现LINQ表达式,我可以强烈推荐该库。它有一些真的,非常漂亮的东西。EF仍然无法将包含.net方法的表达式转换为sql。EF仍然无法将包含.net方法的表达式转换为sql。EF仍然无法将包含.net方法的表达式转换为sql。EF仍然无法将包含.net方法的表达式转换为sql。EF仍然无法将包含.net方法。不幸的是,这具有相同的结果:SWith@Moeri的答案,您仍然可以使用。其中(GetUpdatedPredicate(lastUpdated)):)不幸的是,这具有相同的结果:SWith@Moeri的答案,您仍然可以使用。其中(GetUpdatedPredicate(lastUpdated)):)不幸的是,这具有相同的结果:SWith@Moeri的答案,您仍然可以使用。Where(GetUpdatedPredicate(lastUpdated)):)不幸的是,这有相同的结果:SWith@Moeri的答案,您仍然可以使用。Where(GetUpdatedPredicate(lastUpdated)):)我想您正在尝试做一些类似于我尝试做的事情,并且遇到了与我相同的问题。我