我正在我的表中存储一些过滤数据.让我更清楚一点:我想在数据库中存储一些where子句及其值,并在数据库中检索数据时使用它们.
例如,考虑一个人表(实体集)和其他表中的一些过滤器:
"age","> 70" "gender","= male"
现在,当我从人员表中检索数据时,我想获取这些过滤器来过滤我的数据.
解决方法
一个解决方案是使用
Dynamic Linq Library ,使用这个库你可以有:
filterTable = //some code to retrive it var whereClause = string.Join(" AND ",filterTable.Select(x=> x.Left + x.Right)); var result = context.People.Where(whereClause).ToList();
假设过滤器表具有左和右列,并且要通过AND连接过滤器.
我的建议是在过滤器表中包括更多的细节,例如将操作符与操作数分开,并添加一个确定连接的列为“或”或“和”,并确定另一行连接此列的列.如果要处理更复杂的查询(如A和B)或(C和D),则需要一个树结构.
另一个解决方案是从过滤器表中构建表达式树.这是一个简单的例子:
var arg = Expression.Parameter(typeof(People)); Expression whereClause; for(var row in filterTable) { Expression rowClause; var left = Expression.PropertyOrField(arg,row.PropertyName); //here a type cast is needed for example //var right = Expression.Constant(int.Parse(row.Right)); var right = Expression.Constant(row.Right,left.Member.MemberType); switch(row.Operator) { case "=": rowClause = Expression.Equal(left,right); break; case ">": rowClause = Expression.GreaterThan(left,right); break; case ">=": rowClause = Expression.GreaterThanOrEqual(left,right); break; } if(whereClause == null) { whereClause = rowClause; } else { whereClause = Expression.AndAlso(whereClause,rowClause); } } var lambda = Expression.Lambda<Func<People,bool>>(whereClause,arg); context.People.Where(lambda);
这是非常简化的例子,你应该做许多验证类型转换和…以使其适用于各种查询.