C# 如何将Linq的动态过滤器应用于实体并在服务器端执行它们
我想写一个类,它基本上提供一个条目列表。这些条目可以从数据库中读取,也可以在应用程序生命周期中生成。此类应提供筛选此条目的方法。是否可以以两个源只需要一个过滤器的方式实现过滤器 例如:C# 如何将Linq的动态过滤器应用于实体并在服务器端执行它们,c#,linq,dynamic,linq-to-entities,C#,Linq,Dynamic,Linq To Entities,我想写一个类,它基本上提供一个条目列表。这些条目可以从数据库中读取,也可以在应用程序生命周期中生成。此类应提供筛选此条目的方法。是否可以以两个源只需要一个过滤器的方式实现过滤器 例如: interface IFilter { bool Filter(ILogEntry entry); } interface IFilter { public Expression<Func<ILogEntry, bool>> GetPredicate(); } ... I
interface IFilter
{
bool Filter(ILogEntry entry);
}
interface IFilter {
public Expression<Func<ILogEntry, bool>> GetPredicate();
}
...
IQueryable<ILogEntry> entries = ...
foreach(var filter in filters) {
entries = entries.Where(filter.GetPredicate());
}
对于带有IEnumerable的LINQ,将其作为动态过滤器应用是没有问题的
IEnumerable<IFilter> filters;
IEnumerable<ILogEntry> entries;
foreach(var filter in filters)
entries = entries.Where(p => filter.Filter(p));
是否有方法为ICollection和IQueryable编写筛选器,并确保IQueryable的筛选器将在SQL Server上执行?应用该服务器端的唯一方法是将其组合为表达式树,例如:
interface IFilter
{
bool Filter(ILogEntry entry);
}
interface IFilter {
public Expression<Func<ILogEntry, bool>> GetPredicate();
}
...
IQueryable<ILogEntry> entries = ...
foreach(var filter in filters) {
entries = entries.Where(filter.GetPredicate());
}
接口IFilter{
公共表达式GetPredicate();
}
...
IQueryable条目=。。。
foreach(过滤器中的var过滤器){
entries=entries.Where(filter.GetPredicate());
}
这就需要实现,例如:
public Expression<Func<ILogEntry, bool>> GetPredicate() {
return x => x.SomeField == 25;
}
公共表达式GetPredicate(){
返回x=>x.SomeField==25;
}
注意:如果内存中有数据缺口,可以使用
.AsQueryable()
,从IEnumerable
切换到IQueryable
,这允许它在本地使用表达式树。谢谢,这个答案非常有用。