截取并覆盖linq的where子句

时间:2017-12-14 11:55:09

标签: c# linq extension-methods

我处于这样一种情况:我无法在方法中添加新的参数,也无法改变DataQuery的逻辑 - 因此我只能使用与此类似的结构和T的属性来更改方法的内容。

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

我的问题是我想添加支持检索分配给我的团队,我的公司或我的公司,但我无法访问任何&#34; me&#34;从调用点 - 它们在方法中的UserContext上可用。

DataQuery<T>.Apply()允许我查询像T.caseId <= 4这样的Ts属性,并返回一个包含案例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 个答案:

答案 0 :(得分:0)

所以经过一整夜的徘徊之后,我有一个突破。

我必须创建自定义查询提供程序 - 我使用了本教程: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.TeamIds.Contain(x =&gt; x.Team.Id) 像魅力一样,但不是一个直接的解决方案。