【问题标题】:How to call a lambda expression on IQueryable object如何在 IQueryable 对象上调用 lambda 表达式
【发布时间】:2016-12-01 10:29:05
【问题描述】:

故事

我在模拟一个 IRepository 模式的实现。一切正常,但我对 UpdateMany 方法有疑问。

原始方法

原始方法是使用实​​体框架的查询。Update()。当然,这需要数据库上下文和一些这样的

        public virtual void UpdateMany(IQueryable<T> query, Expression<Func<T, T>> entityInitializer)
    {
        query.Update(entityInitializer);
        this.DbContext.SaveChanges();
    }

模拟方法

由于我不使用 DB 上下文,只是给定类型的 List,Entity 的 IQueryable 扩展方法不起作用(在没有太多合理信息的情况下抛出异常)。我的方法接受相同的参数,但我不知道如何解析它们。

示例表达式

.UpdateMany(x.IsActive, new TestStuff { IsActive = false });

所以基本上,对于存储库中的每个活动 TestStuff,将 IsActive 设置为 false。 当然它不应该绑定到特定的对象

TL;DR 有查询,如何调用 lambda 表达式?

【问题讨论】:

  • 那么,如果您不能使用查询 lambda,您可以尝试做一个简单的 ForEach,并添加一个 if in 来控制它是否处于活动状态?我假设你可以有一个东西列表(IEnumerable)
  • 好吧,这适用于这种特定情况,但我必须接受提供的已实现方法调用,因此我必须以某种方式解析这两个表达式 - 并且在文本中解析它们的主体并不是真正可取的
  • Entity Framework 的 query.Update() AFAIK 没有这样的标准 EF 方法,它从何而来?
  • @IvanStoev Z.EntityFramework.Plus.BatchUpdate.EF6
  • 嗯,这是相当自定义的方法。不能简单地“调用”lambda,你必须理解并重新实现具体的方法逻辑。

标签: c# entity-framework linq


【解决方案1】:

我们最终重新实现了“更新”方法,但它并不像看起来那么明显。

来自 Z.EntityFramework.Plus.BatchUpdate.EF6 的 BulkUpdate 和 Update 扩展类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2021-12-10
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    相关资源
    最近更新 更多