动态添加linq-where语句



我正在使用Mock Data进行原型设计。我想在不同的字段上模拟搜索。并非所有搜索参数都必须填写。我想用设置的过滤器过滤我的模拟数据,但我似乎无法使其工作。

这就是我所拥有的:具有某些属性的模块列表。如ID、姓名代码等

var AllModules = new List<Module>{
new Module{Id=1, Name="MockName", Code="ModCode", Active:false},
new Module{Id=2, Name="MockNameFoo", Code="ModCodeFoo", Active:true}
}

然后,我想添加where子句,这取决于过滤器的属性。

class Filter{
string Text {get;set;}
bool? IsActive {get;set;}
}

然后我想根据过滤器是否设置来过滤列表,所以我尝试了:

public <List<Module> GetModules(Filter modulesQuery)
{
var query = from module in AllModules.AsQueryable()
select module;
if (modulesQuery.IsActive.HasValue)
{
query.Where(x => x.Active== modulesQuery.IsActive.value);
}
if (!string.IsNullOrEmpty(modulesQuery.Text))
{
query.Where(x => x.Name.Contains(modulesQuery.Text,StringComparison.CurrentCultureIgnoreCase)||
x.Code.Contains(modulesQuery.Text, StringComparison.CurrentCultureIgnoreCase)));
}
return query.ToList();
}

然而,这不起作用,并且总是向我返回完整的列表。它忽略了所有where子句,如果你我看到它转到每个if语句并"添加"它们。

我不知道这是不是完全错了?当我第一次使用谓词生成器编写代码时,我也遇到了同样的情况。顺便说一句,这是一个.netCore项目。。。但我不认为这有什么不同。

谢谢

您需要将if块中的查询分配回本地变量。LINQ不会改变原始查询,而是"添加"到它。由于您没有分配它,Where()调用的返回值最终不会被使用。

public List<Module> GetModules(Filter modulesQuery)
{
var query = from module in AllModules.AsQueryable()
select module;
if (modulesQuery.IsActive.HasValue)
{
query = query.Where(x => x.Active== modulesQuery.IsActive.value);
}
if (!string.IsNullOrEmpty(modulesQuery.Text))
{
query = query.Where(x => x.Name.Contains(modulesQuery.Text,StringComparison.CurrentCultureIgnoreCase)||
x.Code.Contains(modulesQuery.Text, StringComparison.CurrentCultureIgnoreCase)));
}
return query.ToList();
}

尝试将结果分配回查询变量。

我不知道实现的其余部分,但我建议您将其保留为IQueryable。因此,在这个阶段,你可以在不坚持的情况下对其进行更多的操作。

只有在真正需要的时候才使用ToList/ToArray。

public IQueryable<Module> GetModules(Filter modulesQuery)
{
var query = from module in AllModules.AsQueryable()
select module;
if (modulesQuery.IsActive.HasValue)
{
query = query.Where(x => x.Active== modulesQuery.IsActive.value);
}
if (!string.IsNullOrEmpty(modulesQuery.Text))
{
query = query.Where(x => x.Name.Contains(modulesQuery.Text,StringComparison.CurrentCultureIgnoreCase)||
x.Code.Contains(modulesQuery.Text, StringComparison.CurrentCultureIgnoreCase)));
}
return query;
}

Where返回您筛选的值的IEnumerable。它不会改变您的原始集合。

示例:

var filteredList = query.Where(x => x.Active== modulesQuery.IsActive.value);

现在,您只是忽略了Where的返回值,我觉得这应该是一个编译器警告,但不管怎样。

最新更新