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
}
}