Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架泛型谓词_C#_.net_Linq_Entity Framework - Fatal编程技术网

C# 实体框架泛型谓词

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 >=

我需要在4-5个差异实体集上共享谓词,最好不要重复代码。所有实体都实现接口
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)):)我想您正在尝试做一些类似于我尝试做的事情,并且遇到了与我相同的问题。我