Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将Linq的动态过滤器应用于实体并在服务器端执行它们_C#_Linq_Dynamic_Linq To Entities - Fatal编程技术网

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
,这允许它在本地使用表达式树。

谢谢,这个答案非常有用。