代码之家  ›  专栏  ›  技术社区  ›  Torben Pi Jensen

截取并重写linq的where子句

  •  0
  • Torben Pi Jensen  · 技术社区  · 7 年前

    我所处的情况是,我无法向方法中添加新参数,也无法更改DataQuery的逻辑,因此我只能更改具有类似结构的方法的内容,以及T的属性。

    IEnumerable<T> Get<T>(DataQuery<T> query) {
      var collection = repo;
      return query.Apply(repo).ToList();
    }
    

    我的问题是,我想添加对检索分配给我的团队、我的公司或只是我的Ts的支持,但我无法从调用点访问任何“我”的上下文-它们在方法的UserContext上可用。

    这个 DataQuery<T>.Apply() 允许我查询Ts属性,如 T.caseId <= 4 并将返回一个包含案例1-4的列表。翻译成 source.Where(t => t.caseId <= 4)

    我的想法是在T中添加以下字段

    bool IsMineQuery
    bool IsMyTeamQuery
    bool IsMyCompanyQuery
    

    然后拦截呼叫 .Where(t => t.IsMineQuery == true) .Where(t => t.IsMyTeamQuery == true) 并将其重写为 .Where(t => t.UserId == UserContext.UserId) .Where(t => UserContext.TeamIds.Contains(t.TeamId)) 但我不知道如何拦截这些电话。

    我如何做到这一点?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Torben Pi Jensen    7 年前

    所以在整夜闲逛之后,我有了突破。

    我必须创建一个自定义查询提供程序-我使用了本教程: https://msdn.microsoft.com/en-us/library/bb546158.aspx

    那么我的控制器的形式

    IEnumerable<T> Get<T>(DataQuery<T> query) {
      var collection = new MyQueryable(repo, UserContext);
      return query.Apply(repo).ToList();
    }
    

    然后,我更改了教程中的“InnerMostWhereFinder”,以确定我的查询是否得到了IsMineQuery或IsMyTeamQuery,并将其替换为UserContext。TeamID。包含(x=>x.Team.Id) 它很有魅力,但不是一个直接的解决方案。