我尝试在EF 6中执行SQL查询。select
查询返回两个字符串列,例如select 'a', 'b'
,可以包含任意数量的行。
我想将结果映射到词典,但我无法解决以下错误。
错误1无法隐式转换类型' System.Data.Entity.Infrastructure.DbRawSqlQuery>'到' System.Collections.Generic.Dictionary'
这是代码:
using (var db = new EFDbContext())
{
Dictionary<string, string> perms = new Dictionary<string, string>();
perms = db.Database.SqlQuery<Dictionary<string, string>>(TheQuery);
}
我在查询后尝试过各种select
和ToDictionary
,但都没有。
答案 0 :(得分:11)
如果对象具有默认构造函数和属性设置器,则可以使用SqlQuery
直接填充对象。然后可以使用结果创建字典。例如:
public class QueryResult
{
public string A { get; set; }
public string B { get; set; }
}
// the colulmn/alias names need to match property names
string query = "SELECT column1 AS [A], column2 AS [B] FROM ..."
using (var db = new EFDbContext())
{
var perms = db.Database.SqlQuery<QueryResult>(query)
.ToDictionary(r => r.A, r => r.B);
}
答案 1 :(得分:1)
我需要从对实体框架的参数化SQL调用返回KeyValuePair列表。我根据之前的文章构建了代码。通过具有通用的dictionaryResult,您可以重复使用它以从具有键值列的任何查询中返回通用键值对的列表。这对任何人都有用:
private class DictionaryResult<K, V>
{
public K Key { get; set; }
public V Value { get; set; }
}
private const string SQL = "select Acct_No as Key, XX as Value from XXXXX where acct_no in ( :accts)";
public List<KeyValuePair<int, string>> GetXXX(string accts)
{
using (var securityEntities = ODPFactory.GetSecurityEntities(_ownerRef))
{
var returnValue = securityEntities.ExecuteStoreQuery<DictionaryResult<int, string>>(SQL, new object[] { accts })
.Select(item => new KeyValuePair<int, string>(item.Key, item.Value))
.ToList();
return returnValue;
}
}
答案 2 :(得分:0)
您是否尝试使用与通过查询返回的两列中的相应值对应的键值对创建字典?
如果是这样,你最好两次查询,并创建两个字符串列表并使用这些字符串创建一个字典。
List<string> keys = new List<string>();
List<string> values = new List<string>();
//Populate Lists with data from LINQ db call
Dictionary<string, string> dict = keys.ToDictionary(x => x, x => values[keys.IndexOf(x)]);
这要求列表具有相同的大小,并且您指定的列具有唯一值。
答案 3 :(得分:0)
使用泛型改进Jjj's answer:
创建通用词典查询结果:
public class DictionaryResult<K,V>
{
public K Key { get; set; }
public V Value { get; set; }
}
用法:
const string query = "select id as Key, name as Value from anywhere";
var resultado = context.Database.SqlQuery<DictionaryResult<int, string>>(query);