我运行了以下查询和代码,我希望在KeyValuePair上返回两列。我看到返回的总行是正确的,但所有的keyvaluepair都是nul!
string query = @"Select id,name from persons";
var persons = context.Database.SqlQuery<KeyValuePair<string,string>>(query);
我看到answer说我必须创建一个类来获得结果;但我的问题是我无法在KeyValuePair上得到结果吗?或者我必须定义一个匹配属性的类?
答案 0 :(得分:3)
问题是KeyValuePair
没有无参数构造函数。 EF通过首先创建一个对象(通过其无参数构造函数)然后设置其属性来实现对象。
答案 1 :(得分:2)
我相信列名需要匹配您尝试将其分配给的类型的某些属性。
您可以尝试将查询更改为@"Select id as Key, name as Value from persons";
,但我认为创建POCO类以将结果投影到
编辑 你不能以这种方式使用KeyValuePair,因为:
The type 'System.Collections.Generic.KeyValuePair`2[System.Int32,System.String]' must declare a default (parameterless) constructor in order to be constructed during mapping.
你应该问自己一些问题:
我认为真正的答案是创建至少一个要存储的类:
public class Person
{
public int id { get; set; }
public string name { get; set; }
}
var persons = context.Database.SqlQuery<Person>(@"Select id, name from persons");
答案 2 :(得分:1)
创建你的配对类
public class KeyIntValueString {
public int Key { get; set; }
public string Value { get; set; }
}
然后
string sql = "SELECT RoleId AS [Key], RoleName AS [Value] FROM dbo.webpages_Roles";
List<KeyValuePair<int, string>> roles = db.Database.SqlQuery<KeyIntValueString>(sql)
.AsEnumerable()
.Select(f => new KeyValuePair<int, string>(f.Key, f.Value))
.ToList();
,例如在mvc视图的情况下,使用KeyValuePair
@model IEnumerable<KeyValuePair<int, string>>
...
@foreach (var item in Model) {
...
@Html.DisplayFor(modelItem => item.Key)
@Html.DisplayFor(modelItem => item.Value)
...
}