使用 Entity Framework 到 return 的 table 数据进行迭代

Using Entity Framework to return a table of data to iterate against

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

然后我遍历 var、object、table(随便你怎么称呼它),在每一行上执行类似(有时不同)的任务。它很好用。我能够创建一个 Entity 对象,公开它的不同复杂功能,然后创建一个 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

}

我最近觉得如果我有一个 class 专门用于访问数据会很酷。这样,我就可以只引用那个class,把相应的连接字符串丢到我的app.config里,然后我就可以把两组逻辑分开了。因此,当尝试在该结构中执行上述操作时,我到了无法 return var 的地步,或者当我尝试匹配对象 return 类型时。存储过程执行的 return 类型是对象(我无法对其进行迭代)。

所以我的问题是,除了 var 结果之外,如何从该数据访问 class 得到 returned?

如果我遗漏了什么,或者因为我做错了而无法做到,请告诉我。它出现在我的脑海里。

我不打算完整地描述架构。但根据您的评论,您可以执行以下操作(这不是确定的也不是唯一的方法):

  1. 在您的数据访问项目中,您保留了 DBContext class、存储过程调用的所有代码以及定义 SP 调用结果的 class,我们称它为 class一个;
  2. 在您的共享层项目中——我建议将其称为服务层——您可以创建一个 XYService class,它有一个方法,例如GetListOfX连接到DB并调用过程,如果需要这个方法也可以执行一些逻辑,但更重要的是:它不是return class A,而是returns 一个新的 class B(这个在服务层中定义,或者可以在另一个项目中定义 - 这可能是真正的 shared/common 项目;因为它只是通用结构的定义它实际上不是一层);
  3. 在您的应用程序层中,您仅使用 XYService 的方法 GetListOfX 和 class B,这样您就不需要对数据访问项目的引用

在一般情况下,class B 与 class A 具有相同的属性。但根据您的需要,class B 可以具有额外的 properties/functionality 它也可以忽略 A 的某些属性,甚至可以将多个属性合并为一个:例如将 FirstNameLastName 合并为一个 属性,简称为 Name.

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

这样的原则