Linq-to-sql用户生成的谓词

时间:2017-01-02 18:08:22

标签: c# linq linq-to-sql

背景:我有一个巨大的表,在数据库中有许多列和许多条目。我有一些返回数据的预设查询,但我需要能够让用户进一步优化查询(添加更多过滤器)。

所以我的问题是我的代码如下:

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端而不是用户端过滤掉)

1 个答案:

答案 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);
相关问题