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
,但我不确定如何继续。
一个选项。。。
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 */;