Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用上下文-实体框架4填充数据集_C#_Asp.net_Entity Framework - Fatal编程技术网

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

C# 使用上下文-实体框架4填充数据集,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我有一些从上下文返回的数据。spCmsCategoriesReadHierarchy正在提取数据 我需要从上下文中获取所有数据并填充我的数据集。我的最终目标是用DataSet对象填充TreeView控件 有什么想法吗?谢谢你的时间和耐心 using (TestHierarchyEntities context = new TestHierarchyEntities()) { int n = 0; Int16 sl = 1; ObjectParameter nn = new

我有一些从上下文返回的数据。
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))
    {
    }
}

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

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

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

此方法将对象列表转换为数据表。这是对我的回答

//
///从列表中创建数据表。
/// https://stackoverflow.com/questions/18746064/using-reflection-to-create-a-datatable-from-a-class
/// 
公共静态数据表CreateDataTable(IEnumerable列表)
{
类型=类型(T);
var properties=type.GetProperties();
DataTable=新的DataTable();
foreach(属性中的属性信息)
{
dataTable.Columns.Add(新的DataColumn(info.Name,null.GetUnderlyingType(info.PropertyType)??info.PropertyType));
}
foreach(列表中的T实体)
{
object[]value=新对象[properties.Length];
for(int i=0;i
此方法将调用数据库中的存储过程,并用结果填充数据集:

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、 我们使用的是实体框架6。我不知道这是否适用于EF4。

如果需要数据集,为什么要使用EF?好像是浪费时间。我会认为你是对的!您知道如何使用上下文(EF)绑定TreeView吗?谢谢,布丽娜,谢谢。正如我写的那样,我的想法是用数据集填充TreeView控件。因为我使用EF 4,所以可以直接绑定到TreeView到EF,而不使用任何数据集吗?我真的很感谢你在这方面的帮助!您是否能够提供一段代码作为开始?当然,您可以始终使用EF对象绑定,您是否使用ASP.NET树视图?如果是这样,您可以轻松地转换内部循环,而不是创建DataRow对象,而是创建TreeNode对象。如果使用datasource方法,我不能100%确定分层绑定方法,但似乎因为每个EF对象都包含其关系作为该实体的属性,所以您可以轻松地重新创建分层结构。感谢Brina,我肯定会尝试发布代码以供其他参考。感谢您现在的帮助,而不仅仅是复制代码并粘贴在这里作为答案,如果您能根据OP的问题对其进行更多的修改,那会更好。例如,OP请求一个数据集,这将返回一个DataTable。如果您提供了一种从OP的代码片段到您提供的代码的方法,也会很好——例如,“用
CreateDataSet(context.spCmsCategoriesReadHierarchy(n,sl,nn))
替换
foreach
语句,或者类似的东西。
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();
}