将动态SQL查询转换为List where函数

时间:2019-05-27 01:56:19

标签: c# sql linq dapper

Datatable是从实体属性视图模型枢转的,因此它的架构未在运行时之前在数据库中定义,但是可以使用动态对象将其作为列表集合进行检索。透视查询结果将是:

NAME    Age CS101   CS202   CS303
---------------------------------
Jack    20  gdg     fff     uuu
Smith   22  wee     zzz     ggg

我们可以在此处通过where方法过滤数据。

list.Where<dynamic>(a => a.CS101== "gdg" && a.CS202 == "fff").ToList();

如果我们知道所有这些字段名称,则可以执行此操作,但是每次都不知道动态列,因为动态列是从EAV模型中获取的。

通常,用户将通过查询表单再次查询某些组合条件,我们可以从下面获得一些条件:

var strWhere = " AND CS202='fff' AND CS303='zfd'";

以上条件应转换为:

a => a.CS202=="fff" && a.CS303=="zfd"

我们如何动态地将字符串查询条件转换为谓词函数?

编辑1:

如果我使用linq动态查询,则会在这里引发异常:

using System.Linq.Dynamic;    
list.Where<dynamic>(a=>a.CS202 == "fff").ToList();        //this works fine.
list.Where<dynamic>("CS202==@0", "fff").ToList();         //throw an exception...

异常详细信息:

No property or field 'CS202' exists in type 'Object'

这是一个动态对象,因此会引发异常。

编辑2:

在Dapper库中,它使用DapperRow返回该项目。更改一些代码后,它现在可以工作。但这不建议使用GertArnold的评论中的高性能解决方案。谢谢大家。

var list = QuickRepository.ExecProcQuery<dynamic>(conn, "pr_eav_EntityAttrValuePivotQuery", param).ToList();
foreach (var a in list)
{
    var fields = a as IDictionary<string, object>;
    if (fields["CCSMU12"].ToString() == "gdg")          //filter by condition
    {
        rList.Add(a);      //return the matched item
    }
}

0 个答案:

没有答案