使用上下文-实体框架4填充数据集。

3

我从上下文中得到了一些数据,这些数据是通过spCmsCategoriesReadHierarchy获取的。

我需要将所有数据从上下文中取出并填充到我的DataSet中。我的最终目标是使用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呢?感觉很浪费时间。 - user1228
你说的没错!你知道如何使用上下文(EF)绑定TreeView吗?谢谢。 - GibboK
3个回答

5
当然,您可以手动将对象中的数据复制到数据集中的数据行中。
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);
}

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


嗨,Brina,谢谢。正如我所写的那样,我的想法是使用DataSet填充TreeView控件。因为我使用EF 4,是否可能直接将TreeView绑定到EF而不使用任何DataSet?我非常感谢您的帮助!您能否提供一段代码作为起点? - GibboK
当然,您可以始终与EF对象绑定,您是否正在使用ASP.NET树视图?如果是这样,您可以轻松地转换内部循环,而不是创建DataRow对象,您可以创建一个TreeNode对象。如果使用数据源方法,我不确定100%的分层绑定方法,但似乎由于每个EF对象都包含其关系作为该实体的属性,因此您可以轻松地重新创建分层结构。 - Brian Mains
谢谢Brina,我一定会尝试并发布代码供其他人参考。暂时先谢谢。 - GibboK

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();
}

这些注释展示了如何双向传递参数。

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


0

这个方法将会把一个对象列表转换成数据表。它是作为这个问题的答案给出的。

/// <summary>
/// Create data table from list.
/// https://dev59.com/FGMl5IYBdhLWcg3wCDKW
/// </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的代码片段到您提供的代码的方法,那就更好了——例如,“用CreateDataSet(context.spCmsCategoriesReadHierarchy(n,sl,nn))替换您的foreach语句”或类似的内容。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接