EF安全lambda组合-(x,y)=>;x>;y转换为(x)=>;x>;常数

本文关键字:gt 转换 安全 常数 组合 EF lambda | 更新日期: 2023-09-27 18:29:15

我有一个SQL表,其中标记的记录会定期"清理"并删除。我需要复制这个数据集,一次是为了性能,两次是为了临时保存删除的记录。

我首先围绕DbSet<T>编写了一个包装器来对数据集进行一些条件缓存。

缓存在启动时初始化,然后定期更新。

我有一个初始化谓词,例如:

Func<Type_x, bool> predicate = entity => true

用于初始化的:

cache(dbset.Where(predicate));

然后稍后我将基于第二个谓词进行更新,它有两个部分:

// a function to get value of Type_y from dbset (dbset is DbSet<Type_x>)
Type_y preUpdate = dbset => dbset.Select(row => row.LastModified).Max()
// the problem predicate
Func<Type_x, Type_y, bool> = (dbset, preUpdate) => dbset.LastModified > preUpdate;

如何从后一个Func<Type_x, Type_y, bool>到EF安全谓词Func<Type_x, bool>

为了清楚起见,将计算类型为Type_y的第二个参数preUpdate,然后需要将其组合到"问题谓词"中,使其为1。成为类型为CCD_ 6和2的谓词。在生成的SQL中产生类似WHERE [TABLE].[LAST_MODIFIED] > SOME_VALUE 的子句

我想我可以使用ExpressionVisitor,但我不确定如何继续。

EF安全lambda组合-(x,y)=>;x>;y转换为(x)=>;x>;常数

一个选项。。。

Func<Type_y, Func<Type_x, bool>> pred = preUpdate => dbset => dbset.LastModified > preUpdate;

(我还没有测试,你可能需要添加更多的括号。)然后,使用它:

Func<Type_x, bool> created = pred(myPreUpdate);

受到LegionMammal978答案的启发,我需要的是这样的东西:

Func<ConcurrentDictionary<Guid, T>, Expression<Func<T, bool>>> updatePredicateBuilder

我用过的:

CachedSet<DbView>.Get(this, DbViewDbSet,
    (DbView entity) => true,
    (DbSet<DbView> set) =>
    {
        var k = set.Select(e => e.Value.LastModified).Max();
        return g => g.LastModified >= k;
    });

注意:如果没有块set => { /* here */ },EF将在执行子句之前将所有记录拉回到运行时。

为了清楚起见,在更新方法中:

var pred = this.updatePredicateBuilder(this.cachedDbSet);
var result = baseDbSet.Where(pred).ToList() /* materialize */;