实体框架6对IDictionary的自定义查询

时间:2019-03-17 07:04:06

标签: sql entity-framework-6 idictionary

我想在未建模的动态表或视图上运行自定义查询

我总是需要1条记录,但字段名称未知

有时可能是view_1,view_2,table_1等

我需要键对值(IDictionary<string,string>)中的结果

我当前的代码是

view_student1 v1= db.view_student1 .Where(e => e.rollNo==1).FirstOrDefault();
var json = JsonConvert.SerializeObject(v1);
return JsonConvert.DeserializeObject<Dictionary<string, string>>(json);

但是在上面的代码中,view_student1是Modeled的,我希望它具有动态性,并在运行时添加任何其他视图,我尝试了以下操作,但无法获取

string sql = "Select * from "+viewName+" where rollNo = '"+ rollNo+"'";
var student = db.Database.SqlQuery<dynamic>(sql).ToList();

IDictionary<string, string> strings = new Dictionary<string, string>();
foreach (var std in student ) {
   //dont know how to get all field names/values here    
   foreach (var fld in std) {      
       strings.Add(fld.Key,fld.value);   
   }
}

1 个答案:

答案 0 :(得分:0)

我假设您有支持json输出的现代SQL Server。通过在sql-query之后添加 for json路径 表达式,可以将结果检索为json。结果以包含对象数组的json字符串形式给出。

以下解决方案使用json-to-dictionary反序列化,可以从Json.NET获得。

string sql = "Select * from "+viewName+" where rollNo = '"+ rollNo+"' for json path";

var student = db.Database.SqlQuery<string>(sql).FirstOrDefault();

IDictionary<string, string> strings  = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(student).First();