加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

实体框架通过字符串sql过滤数据

发布时间:2020-12-12 16:19:31 所属栏目:MsSql教程 来源:网络整理
导读:我正在我的表中存储一些过滤数据.让我更清楚一点:我想在数据库中存储一些where子句及其值,并在数据库中检索数据时使用它们. 例如,考虑一个人表(实体集)和其他表中的一些过滤器: "age"," 70""gender","= male" 现在,当我从人员表中检索数据时,我想获取这些过
我正在我的表中存储一些过滤数据.让我更清楚一点:我想在数据库中存储一些where子句及其值,并在数据库中检索数据时使用它们.

例如,考虑一个人表(实体集)和其他表中的一些过滤器:

"age","> 70"
"gender","= male"

现在,当我从人员表中检索数据时,我想获取这些过滤器来过滤我的数据.

我知道我可以生成一个SQL查询作为一个字符串并执行它,但在EF,LINQ中还有其他更好的方法吗?

解决方法

一个解决方案是使用 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);

这是非常简化的例子,你应该做许多验证类型转换和…以使其适用于各种查询.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读