KeyValuePair在Entity Framework上运行Raw SQL查询

时间:2013-12-12 00:45:35

标签: c# linq entity-framework entity-framework-4 dbcontext

我运行了以下查询和代码,我希望在KeyValuePair上返回两列。我看到返回的总行是正确的,但所有的keyvaluepair都是nul!

string query = @"Select id,name from persons";

var persons = context.Database.SqlQuery<KeyValuePair<string,string>>(query);

我看到answer说我必须创建一个类来获得结果;但我的问题是我无法在KeyValuePair上得到结果吗?或者我必须定义一个匹配属性的类?

3 个答案:

答案 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.
你应该问自己一些问题:

  • 为什么我在使用实体框架时编写内联sql?
  • 为什么我没有可用于存储此查询结果的类/结构?

我认为真正的答案是创建至少一个要存储的类:

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