Tal*_*l l 6 c# linq iqueryable
我已经在IQueryable类型上创建了一个扩展方法,它接受一些实体并根据一些标准对它们进行过滤.我的问题是我不能返回由变量组成的Union表达式,而不是先将所有变量初始化.作为aprears的空值无效.
public static IQueryable<Person> FilterHairColors(this IQueryable<Person> subQuery, string[] hairColors)
{
IQueryable<Person> q1 = null;
IQueryable<Person> q2 = null;
IQueryable<Person> q3 = null;
IQueryable<Person> q4 = null;
foreach (var value in hairColors)
{
switch (value)
{
case "1":
q1 = subQuery.Where(p => p.HairColor_bright == true);
break;
case "2":
q2 = subQuery.Where(p => p.HairColor_brown == true);
break;
case "3":
q3 = subQuery.Where(p => p.HairColor_dark == true);
break;
case "4":
q4 = subQuery.Where(p => p.HairColor_red == true);
break;
}
}
return q1.AsQueryable().Union(q2.AsQueryable()).Union(q3.AsQueryable()).Union(q4.AsQueryable());
}
Run Code Online (Sandbox Code Playgroud)
所呈现的代码块是其中几个的一部分,每个代码块生成一个数据子集,以这种方式传递给后续的过滤方法:
results = persons.FilterGender(vm.gender).FilterAge(vm.age).FilterHeight(vm.height)......
Run Code Online (Sandbox Code Playgroud)
当参数之一为空时,不要调用 Union。
“空查询”对您意味着什么?如果它意味着“没有行”,那么就不要合并它。如果它意味着“所有行”,则不需要合并,因为您可以只采用基础的、未过滤的查询。
像这样:
var result = new [] { q1, q2, q3, q4, }.Where(query => query != null).Aggregate(Queryable.Union);
Run Code Online (Sandbox Code Playgroud)
这是使用 LINQ-to-Objects 构造 LINQ-to-SQL 查询。
新版本:
var result = dataContext.Persons.Where(_ => false);
if(q1 != null) result = result.Union(q1);
if(q2 != null) result = result.Union(q2);
if(q3 != null) result = result.Union(q3);
if(q4 != null) result = result.Union(q4);
Run Code Online (Sandbox Code Playgroud)
SQL Server 查询优化器将删除第一个虚拟查询,以便它根本没有运行时成本。