我处于这样一种情况:我无法在方法中添加新的参数,也无法改变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))
,但我不知道如何拦截来电。
我如何实现这一目标?
答案 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) 像魅力一样,但不是一个直接的解决方案。