c# - 从 Entity Framework 返回自定义对象 <List T> 并分配给对象数据源

标签 c# entity-framework stored-procedures entity-framework-4 objectdatasource

我需要一些有关问题的指导,我使用的是 Entity Framework 4.0,我有 DAL 和 BLL,并且正在绑定(bind)到页面上的 ObjectDataSource。

我必须使用 PIVOT 和动态 SQL 编写一个存储过程,以我想要的方式从多个实体返回数据。现在我想弄清楚如何让 Entity Framework 返回一个自定义对象,我可以绑定(bind)到页面上的 ObjectDataSource,我需要使用自定义对象或动态对象,因为存储过程可以返回任意数量的列所以我不能使用强类型类或实体,我还需要能够将其与 ObjectDataSource 绑定(bind)。

有人可以指出执行此操作的好方法以及如何定义我的功能吗?请提供一些代码示例。

我读到我应该尝试使用 List<T> 返回一个对象,因为 EF 不支持返回数据表/数据集,到目前为止我有以下内容,但我知道这是不正确的。

我使用泛型的工作不多,如果您能指出如何做到这一点,我相信这会对很多人有所帮助。请提供函数的代码示例以及如何将 ObjectDataSource 绑定(bind)到返回对象?

非常感谢您的帮助!!

感谢你的帮助,理查德,根据你对使用 DbDataRecord 的建议,这就是我的函数现在的样子

DAL 中 ObjectDataSource 的 C# 函数

public List<DbDataRecord> GetData(int product_id)
{
    List<DbDataRecord> availableProducts = new List<DbDataRecord>();

    var groupData = context.ExecuteStoreQuery<DbDataRecord>("exec 
  spGetProducts @ProductID={0}", product_id);

    availableProducts = groupData.ToList<DbDataRecord>();

    return availableProducts;
}

ASPX页面中的ObjectDataSource

<asp:ObjectDataSource ID="ODSProductAvailability" runat="server"
        TypeName="Project.BLL.ProductBL" 
        SelectMethod="GetData"  >
     <SelectParameters>
        <asp:SessionParameter Name="product_id" SessionField="ProductID" />
     </SelectParameters>
</asp:ObjectDataSource>

现在我在访问该页面时遇到此错误:

The result type 'System.Data.Common.DbDataRecord' may not be abstract and must include a default constructor

这是因为 ExecuteStoreQuery 需要定义类或实体吗?我怎样才能根据存储过程的结果创建一个对象并将其分配给它?

最佳答案

如果您已经有一个与您的 proc 返回类型相匹配的实体类型,请将其用作类型参数。

public List<MyEntity> GetData<MyEntity>(int product_id) where T : class 
{

    List<MyEntity> myList = new List<MyEntity>(); 

    var groupData = context.ExecuteStoreQuery<MyEntity>("exec 
    spGetProductsByGroup @ProductID={0}", product_id);

    return myList;
}

否则你可以使用 ADO.NET DataReader手动构建列表。

using (SqlConnection connection = new SqlConnection("your connection string"))
{
    SqlCommand command = new SqlCommand(
      "exec spGetProductsByGroup @ProductID",
      connection);
    command.Parameters.Add(product_id);

    connection.Open();

    SqlDataReader reader = command.ExecuteReader();

    List<ProcType> list = new List<ProcType>();
    if (reader.HasRows)
    {
        while (reader.Read())
        {
            list.Add(new ProcType(){Property1 = reader.GetInt32(0), Property1 = reader.GetString(1));
        }
    }
    reader.Close();

    return list;
}

关于c# - 从 Entity Framework 返回自定义对象 <List T> 并分配给对象数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7918071/

相关文章:

c# - 当我事先不知道 key 时,如何在 C# 中解析 JSON 对象?

c# - EntityFramework 包版本 ="6.1.3"和 Web 配置版本 6.0.0.0?

sql - 无法将 lambda 表达式转换为委托(delegate)类型

c# - 从 C# 中的存储过程捕获错误

c# - 存储过程,日期时间

java - 使用 GROOVY SQL 从 SQL SERVER 存储过程获取结果集

c# - iTextSharp XMLWorker 解析真的很慢

C#:给定 src => src.property,如果你有一个字符串 "propertyname",代码选择属性?

c# - MVC 模型属性

c# - Entity Framework : Updating a field to a null value?