使用SqlQuery <dictionary <string,string =“”>&gt;在实体框架6中

时间:2015-06-11 04:24:38

标签: c# .net entity-framework dictionary entity-framework-6

我尝试在EF 6中执行SQL查询。select查询返回两个字符串列,例如select 'a', 'b',可以包含任意数量的行。

我想将结果映射到词典,但我无法解决以下错误。

  

错误1无法隐式转换类型&#39; System.Data.Entity.Infrastructure.DbRawSqlQuery&gt;&#39;到&#39; System.Collections.Generic.Dictionary&#39;

这是代码:

using (var db = new EFDbContext())
{
    Dictionary<string, string> perms = new Dictionary<string, string>();
    perms = db.Database.SqlQuery<Dictionary<string, string>>(TheQuery);
}

我在查询后尝试过各种selectToDictionary,但都没有。

4 个答案:

答案 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,您可以重复使用它以从具有键值列的任何查询中返回通用键值对的列表。这对任何人都有用:

  1. 通用类:
    private class DictionaryResult<K, V>
        {
            public K Key { get; set; }
            public V Value { get; set; }
        }
  1. 定义您的SQL:
private const string SQL = "select Acct_No as Key, XX as Value from XXXXX where acct_no in ( :accts)";
  1. 使用通用类返回键值对的列表:
    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);