如何正确使用EF5的DbContext使用SQL查询获取值?

时间:2013-06-26 19:04:52

标签: c# entity-framework entity-framework-5

我一直试图围绕正确的方式使用EF5的DbContext来使用SQL查询数据。我完全知道EF是一个ORM,通常用于linqTOentities和实体对象。但我有一个有趣的案例需要SQL。

以下是我一直在使用的示例代码:

testQuery = "select 'HITHERE' as firstval, 'HOTHERE' as secondval;";
var results = DataContext.Database.SqlQuery<string>(testQuery);

当我运行上面的代码(C#)时,我收到以下错误:

{"The data reader has more than one field. Multiple fields are not valid for EDM primitive or enumeration types."}

我认为该错误与string的{​​{1}}部分不是要绑定的正确类型有关。所以我把代码更改为:

.SqlQuery<string>(testQuery)

当我运行这个更新的代码时,testQuery = "select 'HITHERE' as firstval, 'HOTHERE' as secondval;"; var results = DataContext.Database.SqlQuery<List<string>>(testQuery); 没有值,count是0.但是,当我在SSMS中运行测试sql查询时,我得到你所期望的;一行,两个带列名称的值。 firstVal = HITHERE和secondVal = HOTHERE。

如何将这些选择值绑定到C#中的变量与DbContext?

1 个答案:

答案 0 :(得分:3)

DataContext.Database.SqlQuery<string>(testQuery);预计单个字符串值每行,因此以下查询将满足此设置

select 'HITHERE' as firstval
union
select 'HOTHERE' as secondval;";

对于您正在运行的查询,您需要一个具有2个字符串属性的类(或某种类型)

public class resultsClass
{
    public string firstval { get; set; }
    public string secondval { get; set; }
}

然后你可以做

var results = DataContext.Database.SqlQuery<resultsClass>(testQuery);

应该包含一个结果


更新

您的示例似乎包含键/值对 - 您是否可以使用它?

select 'firstValue', 'HITHERE'
union
select 'secondValue', 'HOTHERE'

public class resultsClass
{
    public string key { get; set; }
    public string value { get; set; }
}

var results = DataContext.Database.SqlQuery<resultsClass>(testQuery);