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_Data Access Layer - Fatal编程技术网

C# 使用实体框架返回要迭代的数据表

C# 使用实体框架返回要迭代的数据表,c#,entity-framework,data-access-layer,C#,Entity Framework,Data Access Layer,我目前正在使用EF 6执行以下操作。执行一个存储过程,然后输入我需要使用的数据。每次应用程序运行的数据通常为30-40行 然后,我迭代var、object、table(无论您如何称呼它),在每一行上执行类似(有时不同)的任务。它工作得很好。我能够创建一个实体对象,公开它的不同复杂函数,然后创建一个var进行迭代 比如: foreach (var result in StoredProcedureResult) { string strFirstname = result.FirstName st

我目前正在使用EF 6执行以下操作。执行一个存储过程,然后输入我需要使用的数据。每次应用程序运行的数据通常为30-40行

然后,我迭代var、object、table(无论您如何称呼它),在每一行上执行类似(有时不同)的任务。它工作得很好。我能够创建一个实体对象,公开它的不同复杂函数,然后创建一个var进行迭代

比如:

foreach (var result in StoredProcedureResult)
{
string strFirstname = result.FirstName
string strLastName = result.LastName
//more logic goes here using those variables and interacting with another app

}
我最近认为,如果我有一个专门用来访问数据的类,那会很酷。这样,我就可以引用该类,将相应的连接字符串放入app.config中,然后将两组逻辑分开。因此,当尝试在该结构中执行上述操作时,我会到达无法返回var的点,或者当我尝试匹配对象返回类型时。存储过程执行的返回类型是object(我不能对其进行迭代)

所以我的问题是,除了从这个数据访问类返回var结果之外,如何获得上面的示例


如果我遗漏了什么,或者因为我做得不正确而不可能,一定要让我知道。它出现在我的脑海中。

我不打算完整描述该体系结构。但根据您的评论,您可以做以下事情(这不是确定的,也不是唯一的方法):

  • 在数据访问项目中,您保留DBContext类、存储过程调用的所有代码以及定义SP调用结果的类,我们称之为class A
  • 在您的共享层项目中——我建议将其称为服务层——您可以创建一个XYService类,该类具有一个连接到DB并调用过程的方法,例如
    GetListOfX
    ,如果需要,该方法还可以执行一些逻辑,但更重要的是:它不返回类a,而是返回一个新的类B(这是在服务层中定义的,或者可以在另一个项目中定义——这可能是真正的共享/公共项目;因为它只是公共结构的定义,而不是真正的层)
  • 在应用程序层中,您只使用XYService和类B的方法
    GetListOfX
    ,这样您就不需要对数据访问项目的引用
  • 在一般情况下,B类具有与a类相同的属性。但根据您的需要,B类可以具有其他属性/功能,它也可以忽略a的某些属性,甚至可以将多个属性组合为一个:例如,将
    FirstName
    LastName
    组合为一个简单称为
    N的属性ame


    基本上,您正在寻找的是多层应用程序体系结构(通常为3-4层)。这种方法的全部范围(包括大量使用接口和依赖项注入等概念)基于您的目标,可能不适合或不需要,例如,如果您只为自己构建一个具有两个功能的小型应用程序,或者您知道最终解决方案的组件不会被重用,那么这种方法太浪费,您可以在一个项目中更快地处理所有内容-您仍然应该应用原则like和。

    您在EF中看过函数导入了吗?@Marty嘿,谢谢您的回复。我觉得我已经在使用函数导入了?这不是上面的代码片段的结果吗?StoredProcedureResult是因为执行了以下操作:
    EntityName db=new EntityName();var StoredProcedureResult=db.Sp_,它返回_SomeRows_和_Columns();db.Dispose()
    首先:如果
    EntityName
    是DbContext的类名,则更常见的方法是使用
    而不是
    Dispose
    。第二:函数导入应允许您指定过程返回复杂类型,这样您将得到返回的类型而不是object@Marty好的,抓住你了,威尔我用using.hmm把它包装起来,它看起来确实像是在下拉列表中设置为“complex”所以VS调用的完全限定类型是:
    System.Data.Entity.Core.Objects.ObjectResult
    @Marty好吧,上面的内容似乎解决了返回类型的问题,
    ObjectResult
    是一个可以迭代的返回类型。还有一个小问题。在我的帖子中,以返回名字或姓氏为例,您可以看到创建了特定列的get和set,在DataAccessLayer中我可以看到这些方法。问题是,在引用DAL的项目中,
    string strFirstname=result。FirstName
    没有intellisense在键入
    result.
    时显示列列表,所以我想这里肯定缺少一些内容。实现了这一点解决方案。有了您的阅读链接和精彩的解释,我想我现在已经开始制作一个像样的分层应用程序。这不是我应该做的,而是我可以做的。有了这些帮助,我能够做到。谢谢Marty!我想我唯一可能偏离您方向的地方是在第一步。我的数据层看起来更像一个服务层e类,只包含使用EF调用SP的方法,然后返回结果。我认为这与您所说的有所不同:存储过程调用的所有代码以及定义SP结果的类call@MikeCMR有多种方法可以使用EF,在简单的情况下,您甚至不需要SP,可以查询ta使用LINQ的bles,如果您还没有看过它,我建议您阅读它;)