首页 >数据库 >mysql教程 >如何使用实体框架从 SQL 查询中提取匿名类型结果?

如何使用实体框架从 SQL 查询中提取匿名类型结果?

Susan Sarandon
Susan Sarandon原创
2024-12-31 17:26:14278浏览

How to Extract Anonymous Type Results from SQL Queries Using Entity Framework?

从实体框架中的 SQL 查询中提取匿名类型结果

在实体框架中,SqlQuery方法用于执行原始 SQL 查询并将结果作为指定类型 T 的对象返回。但是,当尝试使用此方法仅从表中检索特定列时,开发人员可能会遇到异常,因为数据读取器与预期不兼容。对象类型。

要克服此限制并获得匿名类型结果,解决方案在于直接利用原始 SQL。提供的方法 DynamicListFromSql 允许开发人员实现此功能。

public static IEnumerable<dynamic> DynamicListFromSql(this DbContext db, string Sql, Dictionary<string, object> Params)
{
    using (var cmd = db.Database.Connection.CreateCommand())
    {
        cmd.CommandText = Sql;
        if (cmd.Connection.State != ConnectionState.Open) { cmd.Connection.Open(); }

        foreach (KeyValuePair<string, object> p in Params)
        {
            DbParameter dbParameter = cmd.CreateParameter();
            dbParameter.ParameterName = p.Key;
            dbParameter.Value = p.Value;
            cmd.Parameters.Add(dbParameter);
        }

        using (var dataReader = cmd.ExecuteReader())
        {
            while (dataReader.Read())
            {
                var row = new ExpandoObject() as IDictionary<string, object>;
                for (var fieldCount = 0; fieldCount < dataReader.FieldCount; fieldCount++)
                {
                    row.Add(dataReader.GetName(fieldCount), dataReader[fieldCount]);
                }
                yield return row;
            }
        }
    }
}

此方法使开发人员能够执行 SQL 查询并以动态对象的形式检索结果,这些结果以键值对的形式存储在ExpandoObject 实例。

要在您自己的代码中使用此方法,只需按如下方式调用它:

List<dynamic> results = DynamicListFromSql(myDb,"select * from table where a=@a and b=@b", new Dictionary<string, object> { { "a", true }, { "b", false } }).ToList();

通过利用此方法通过这种方式,开发者可以轻松地从 SQL 查询中获取匿名类型结果,方便检索特定列或根据查询结果创建自定义数据结构。

以上是如何使用实体框架从 SQL 查询中提取匿名类型结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn