我使用String Builder在C#中生成RAW SQL QUERY。
List<string> columns = new List<string>();
columns.Add("id");
columns.Add("Temp");
StringBuilder SqlStatement = new StringBuilder();
SqlStatement.Append("Select ");
for (int i = 0; i < columns.Count; i++)
{
if (i == columns.Count - 1)
{
SqlStatement.Append(columns[i]);
}
else
{
SqlStatement.Append(columns[i]);
SqlStatement.Append(",");
}
}
SqlStatement.Append(" FROM graph_update");
var ctx = new graphDBContext();
var result = ctx.Database.SqlQuery<graphDBContext>(SqlStatement.ToString()).ToList();
这转换为SELECT id,Temp FROM graph_update
结果给了我
id = 1, temp = 20
id = 2 temp = 30
如何获得所有这些值????
我太习惯了:
foreach(var item in result)
{
item.id = id;
item.temp = temp;
}
但它不会让我。
编辑: 对不起,但我不确定你的意思。这是我的调试器
答案 0 :(得分:2)
如果没有错误返回
,请尝试使用foreachforeach(var v in result)
{
String v0 = v[0].ToString();
String v1 = v[1].ToString();
}
答案 1 :(得分:1)
我希望这会有所帮助。
foreach(var item in result)
{
var id = item.id;
var temp = item.temp;
}
在上面的代码中,您尝试将值分配给项目,而不是检索。
答案 2 :(得分:1)
假设你有EF&gt; 6,然后是ctx.Database.SqlQuery
,根据方法文档:
创建一个原始SQL查询,该查询将返回给定泛型类型的元素。 类型可以是具有与查询返回的列的名称匹配的属性的任何类型,也可以是简单的基本类型。该类型不必是实体类型。即使返回的对象类型是实体类型,上下文也不会跟踪此查询的结果。
考虑到这一点,你可以做这样的事情:
public class GraphUpdateResult
{
public int Id {get; set;}
public decimal Temp {get; set;}
}
然后在你当前的方法中:
var result = ctx.Database.SqlQuery<GraphUpdateResult>SqlStatement.ToString()).ToList();
foreach (var graphResult in result)
{
Console.WriteLine(graphResult.Id);
Console.WriteLine(graphResult.Temp);
}
您可以向GraphUpdateResult
类添加更多列以供EF绑定,即使在某些查询中您未在select
语句中指定它们。
答案 3 :(得分:1)
您可以使用像
这样的ORM-Mapperhttps://stormy.codeplex.com/SourceControl/latest#Stormy.cs
它是一个非常轻的Mapper,你可以看看它是如何工作的。
它将阅读器数据映射到对象数据:
public class CatMapper : ISelectable<Cat>
{
public Cat ApplySelect(IDataReader reader)
{
return new Cat()
{
Name = reader["name"].ToString(),
Weight = (float)reader["weight"]
};
}
}