Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 实体框架从存储过程中获取非实体对象_C#_Entity Framework_Stored Procedures - Fatal编程技术网

C# 实体框架从存储过程中获取非实体对象

C# 实体框架从存储过程中获取非实体对象,c#,entity-framework,stored-procedures,C#,Entity Framework,Stored Procedures,我使用的是实体框架6 我想运行一个存储过程,该过程每行返回一个非实体对象3列 using(var dbContext = new DBContextEntity()) { var queryProducts = dbContext.Database.SqlQuery<DataTable>("dbo.GetProductByDesc @q", query); } 如何以数据集或匿名对象的形式获取数据,我可以对其进行迭代?据我所知,EntityF

我使用的是实体框架6

我想运行一个存储过程,该过程每行返回一个非实体对象3列

using(var dbContext = new DBContextEntity())
{
    var queryProducts = dbContext.Database.SqlQuery<DataTable>("dbo.GetProductByDesc @q", query);                
}

如何以数据集或匿名对象的形式获取数据,我可以对其进行迭代?

据我所知,EntityFramework不提供匿名对象物化。原因是它可能会为每种类型生成IL代码并对其进行缓存,或者只是执行简单的PropertyInfo缓存

解决方案是创建一个简单的类,该类的属性与存储过程结果集的名称匹配,并将该类用作SqlQuery的通用参数

编辑:

SqlQuery实现IEnumerable,当您迭代它时,它会在当前线程中自动执行。例如,要迭代结果,您可以:

foreach(var product in queryProducts)
{
   // do something with each product here
}
您还可以将产品类实例列表传递给需要它的函数:

ShowProducts(queryProducts.ToList());

您还可以在后台运行查询,并在查询完成后返回产品列表。可以找到有关异步获取的更多信息。

如@Too所说,最好定义一个POCO类,其属性与StoredProcedure或其他SQL语句返回的字段名和数据类型相对应

通常最好避免在您正在进行的任何新开发工作中使用数据集。它们确实有自己的用途,但在POCO明显避免的高吞吐量场景中会有性能损失

如果数据集的吸引力在于能够通过连接轻松地序列化数据或将数据序列化到文件以供以后使用,那么各种序列化框架将帮助您实现这一点,例如DataContractSerializer、Newtonsoft.Json等

如果POCO是在PCL可移植类库中定义的,那么这也允许可移植性


如果必须使用数据集,我宁愿使用类型化数据集。DataRow可以用作@Too答案中的POCO,因为它们有一个默认构造函数。注意空值及其在字符串以外的字段中的独特处理。

只需为结果创建一个类,然后就可以执行SqlQuery…我如何迭代它?我刚刚编辑了答案,并提供了更多迭代信息。