【问题标题】:Populate a DataSet using Context - Entity Framework 4使用上下文填充数据集 - 实体框架 4
【发布时间】:2011-01-07 14:02:26
【问题描述】:

我有一些从上下文返回的数据。数据已被spCmsCategoriesReadHierarchy拉取。

需要从上下文中获取所有数据并填充我的数据集。我的最终目标是使用 DataSet 对象填充 TreeView 控件。

有什么想法吗?感谢您的时间和耐心。

using (TestHierarchyEntities context = new TestHierarchyEntities())
{
    int n = 0;
    Int16 sl = 1;
    ObjectParameter nn = new ObjectParameter("nn", typeof(int));

    // Create a Data Set where adding the result of context 
    DataSet dataSet = new DataSet("myDataSet");

    foreach (CmsCategory categories in context.spCmsCategoriesReadHierarchy(n,sl,nn))
    {
    }
}

【问题讨论】:

  • 如果您需要数据集,为什么要使用 EF?好像是在浪费时间。
  • 我认为你是对的吗!你知道如何使用上下文 (EF) 绑定 TreeView 吗?谢谢

标签: c# asp.net entity-framework


【解决方案1】:

当然,您可以手动将数据从对象复制到数据集中的数据行。

DataSet dataSet = new DataSet("myDataSet");
dataSet.Tables.Add(new DataTable());
//Setup the table columns.

foreach (CmsCategory categories in context.spCmsCategoriesReadHierarchy(n,sl,nn))
{
    DataRow row = dataSet.Tables[0].NewRow();
    row["A"] = categories.A;
    row["B"] = categories.B;

    dataSet.Tables[0].Rows.Add(row);
}

如果您不希望将属性显式复制到数据行,也可以使用反射进行复制。

【讨论】:

  • 嗨,布丽娜,谢谢。正如我写的那样,我的想法是使用 DataSet 填充 TreeView 控件。因为我使用 EF 4 可以将 TreeView 直接绑定到 EF 而不使用任何 DataSet?我真的很感谢你在这方面的帮助!你能提供一段代码开始吗?
  • 当然,您总是可以绑定 EF 对象,您使用的是 ASP.NET 树视图吗?如果是这样,您可以轻松地转换内部循环,而不是创建 DataRow 对象,而是创建一个 TreeNode 对象。如果使用数据源方法,我不确定 100% 的层次绑定方法,但似乎因为每个 EF 对象都包含其关系作为该实体的属性,您可以轻松地重新创建层次结构。
  • 感谢布丽娜,我肯定会尝试发布代码以供其他参考。谢谢你现在
【解决方案2】:

此方法将调用数据库中的存储过程,并用结果填充数据集:

var dataSet = new DataSet();
using ( var sqlCmd = context.Database.Connection.CreateCommand() )
{
    sqlCmd.CommandType = CommandType.StoredProcedure;
    sqlCmd.CommandText = "spCmsCategoriesReadHierarchy";
    // sqlCmd.Parameters.Add( new SqlParameter( "@Parameter", value ) );
    // sqlCmd.Parameters.Add( new SqlParameter( "@Error", null ) { Direction = ParameterDirection.Output, Size = -1 } );

    // Define the data adapter and fill the dataset 
    using ( DbDataAdapter da = new SqlDataAdapter() )
    {
        da.SelectCommand = sqlCmd;
        da.Fill( dataSet );
    }
    // resultDetail.Error = sqlCmd.Parameters["@Error"].Value.ToString();
}

cmets 展示了如何双向传递参数。

p.s.:我们使用的是 Entity Framework 6。我不知道这是否适用于 EF4。

【讨论】:

    【解决方案3】:

    此方法会将对象列表转换为数据表。它是作为this question.的答案而给出的

    /// <summary>
    /// Create data table from list.
    /// https://stackoverflow.com/questions/18746064/using-reflection-to-create-a-datatable-from-a-class
    /// </summary>
    public static DataTable CreateDataTable<T>(IEnumerable<T> list)
    {
        Type type = typeof(T);
        var properties = type.GetProperties();      
    
        DataTable dataTable = new DataTable();
        foreach (PropertyInfo info in properties)
        {
            dataTable.Columns.Add(new DataColumn(info.Name, Nullable.GetUnderlyingType(info.PropertyType) ?? info.PropertyType));
        }
    
        foreach (T entity in list)
        {
            object[] values = new object[properties.Length];
            for (int i = 0; i < properties.Length; i++)
            {
                values[i] = properties[i].GetValue(entity);
            }
    
            dataTable.Rows.Add(values);
        }
    
        return dataTable;
    }
    

    【讨论】:

    • 与其只是复制代码并在此处粘贴作为答案,不如根据 OP 的问题对其进行定制会更好。例如,OP 请求一个 DataSet,这将返回一个 DataTable。如果您包含一种从 OP 的代码 sn-p 到您提供的代码的方法,那也很好 - 例如,“用 CreateDataSet(context.spCmsCategoriesReadHierarchy(n,sl,nn)) 替换您的 foreach 语句”或类似的东西。
    猜你喜欢
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    相关资源
    最近更新 更多