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