如何解决在IQueryable上应用内部表达式过滤器
假设我有以下对象:
public class Source { public string Name; }
public class Target { public string Name; }
public class Result
{
public Source SourceObj;
public Target TargetObj;
}
现在,从目标过滤器IQueryable<Result>
中获取Expression<Func<Target,bool>> filter
,我想为其准备表达式过滤器。过滤器方法签名如下所示:
public Expression<Func<Result,bool>> Filter(IQueryable<Result> collection,Expression<Func<Target,bool>> targetFilter)
{
in result expression: "in given collection select items where their property TargetObj satisfies targetFilter"
}
任何建议将不胜感激。谢谢
解决方法
如果您确实希望使用表达式作为Filter
方法的返回值,则不需要IQueryable<Result> collection
。
public Expression<Func<Result,bool>> Filter(Expression<Func<Target,bool>> targetFilter)
{
Func<Target,bool> func = targetFilter.Compile();
Expression<Func<Result,bool>> resultExpression = r => func(r.TargetObj);
return resultExpression;
}
用法:
var results = new List<Result>()
{
new Result() { TargetObj = new Target() { Name = "A" }},new Result() { TargetObj = new Target() { Name = "B" }},new Result() { TargetObj = new Target() { Name = "C" }},};
var expression = Filter(r => r.Name == "B");
var func = expression.Compile();
var filteredResults = results.Where(r => func(r));
这里的样本过滤结果将以B返回目标。根据我对目标的理解,直接使用Linq Where对我来说更有意义。
编辑:由于您已经向问题中添加了新因素,因此这里介绍了如何将目标过滤器添加到基本过滤器中。
public Expression<Func<Result,bool>> Filter(Expression<Func<Result,bool>> baseFilter,Expression<Func<Target,bool>> targetFilter)
{
Func<Result,bool> baseFunc = baseFilter.Compile();
Func<Target,bool> targetFunc = targetFilter.Compile();
Expression<Func<Result,bool>> resultExpression = r => baseFunc(r) && targetFunc(r.TargetObj);
return resultExpression;
}
,
我不太确定我是否正确理解了您的目标,但是我认为这可能是您想要的东西。
使用linq Select
,您可以映射源集合中的元素。因此,这里我们将结果映射到目标,然后应用目标过滤器。
public IQueryable<Target> GetFilteredTargets(IQueryable<Result> collection,bool>> targetFilter)
{
return collection.Select(result => result.Target).Where(targetFilter);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。