背景:我有一个巨大的表,在数据库中有许多列和许多条目。我有一些返回数据的预设查询,但我需要能够让用户进一步优化查询(添加更多过滤器)。
所以我的问题是我的代码如下:
var dbquery = (from a in db.test where id > 100 select a);
这将返回一个iQueryable。现在,当我这样做时,我可以进一步过滤它(并且仍然在数据库上运行查询)
var dbquery2 = dbquery.Where(b => b.quanity > 20);
但我真正想要的是让用户能够输入过滤器并让它仍在db上运行。我已经看过PropertyDescriptors,但他们总是说没有合适的linq到sql的翻译。 我怎么能这样做:
var dbqueryuser = dbquery.where(c => c.(user specified field) > 20);
我是否需要执行自定义生成的SQL语句,或者我可以以某种方式生成有效的
Expression<Func<test,bool>>
使用反射的语句?
注意:这是基于我在此问Linq to custom sql
之前提出的问题我基本上需要获取过滤器列表但是要在db上运行查询(因为db返回了大量数据,我想在db端而不是用户端过滤掉)
答案 0 :(得分:1)
您必须生成自定义Expression
,例如(它不会编译):
var param = Expression.Parameter(typeof(Entity));
var property = Expression.PropertyOrField(param, propertyName);
var greater = Expression.GreaterThan(property, Expression.Constant(20));
var lambda = (Expression<Func<Entity, bool>>)Expression.Lambda(greater, param);