【问题标题】:Linq-to-sql user generated predicateLinq-to-sql 用户生成的谓词
【发布时间】:2017-01-02 18:08:21
【问题描述】:

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

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

var dbquery = (from a in db.test where id > 100 select a);

这会返回一个 iQueryable。现在,当我这样做时,我可以进一步过滤它(并且仍然在数据库上运行查询)

var dbquery2 = dbquery.Where(b => b.quanity > 20);

但我真正想要的是让用户能够输入过滤器并让它仍然在数据库上运行。我看过 PropertyDescriptors 但他们总是说没有合适的 linq 到 sql 的翻译。 我该怎么做这样的事情:

var dbqueryuser = dbquery.where(c => c.(user specified field) > 20);

我是否需要自定义生成的 SQL 语句,或者我可以以某种方式生成有效的

Expression<Func<test,bool>> 

使用反射的语句?

注意:这是建立在我之前在这里提出的问题Linq to custom sql

我基本上需要获取过滤器列表,但要让查询在数据库上运行(因为数据库返回大量数据,我希望在数据库端而不是用户端进行尽可能多的过滤)

【问题讨论】:

  • 是的,您可以动态生成Expression&lt;Func&lt;test,bool&gt;&gt;,不是使用反射,而是使用Expression 类方法。有很多关于这样做的例子,如果你想要更具体的答案,你应该发布你的过滤器定义的样子。

标签: c# linq linq-to-sql


【解决方案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);

【讨论】:

  • Works :) 谢谢 我怎样才能在可以为空的属性上做到这一点呢?它说没有大于运算符可以将 Nullable 与 System.Int32 进行比较
  • 它们没有可比性,你应该从 nullable 或者更好的方法获取属性 Value,调用方法 "getValueOrDefault" ,或者阅读例如 hier:stackoverflow.com/questions/586097/… 有很多关于 SO 上的表达式的东西
  • 我看看 :) 谢谢,但我确实找到了另一个解决方案 var testnull = Expression.TypeAs(Expression.Constant(20), typeof(Nullable)); var Greater = Expression.GreaterThan(property,testnull);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
相关资源
最近更新 更多