【问题标题】:How to select just some fields from a table in EF如何从 EF 中的表中仅选择某些字段
【发布时间】:2011-11-13 10:42:06
【问题描述】:

我在数据库中有一个包含 9 列的表,如果需要,我希望能够仅加载其中的一些字段。

请问我该如何使用 Entity Framework 4 做到这一点?

例如我的表有这些字段:

ID, FirstName, LastName, FotherName, BirthDate, Mobile, Email

我希望能够只获取这些列:

ID, FirstName, LastName

我的项目是一个ASP.NET MVC 3 应用程序,包含SQLServer 2008 ExpressEF 4.1

【问题讨论】:

    标签: asp.net-mvc entity-framework asp.net-mvc-3 lambda entity-framework-4.1


    【解决方案1】:

    假设您有一个使用此模型的表:

    public class User{
        public int ID {get; set;}
        public string NickName {get; set;}
        public string FirstName {get; set;}
        public string LastName {get; set;}
        public string FotherName {get; set;}
        public DateTime BirthDate {get; set;}
        public string Mobile {get; set;}
        public string Email {get; set;}
        public string Password {get; set;}
    }
    

    现在,您只想获取 IDFirstNameLastNameFotherName。您可以通过 2 种方式进行操作;第一种方法是将它们作为anonymous 对象获取,看:

    var user = entityContext.Users.Where(u => u.ID == id)
        .Select(u => new {
            ID = u.ID,
            FirstName = u.FirstName,
            LastName = u.LastName,
            FotherName = u.FotherName
        }).Single();
    

    现在,您的返回值类型是anonymous,您可以使用它,例如:

    var i = user.ID;
    // or
    var s = user.FirstName;
    

    以另一种方式(例如,当您想将对象作为 Model 传递给 View 时),您可以定义一个新的类,(即UserViewModel),当您选择对象时,将其选为UserViewModel。看:

    public class UserViewModel{
        public int ID {get; set;}
        public string NickName {get; set;}
        public string FirstName {get; set;}
        public string LastName {get; set;}
        public string FotherName {get; set;}
    }
    

    在查询中,取这个:

    var user = entityContext.Users.Where(u => u.ID == id)
        .Select(u => new UserViewModel {
            ID = u.ID,
            FirstName = u.FirstName,
            LastName = u.LastName,
            FotherName = u.FotherName
        }).Single();
    

    看,他们之间只有 ONE 的区别,在 labda 表达式中,而不是 u => new {} 我们正在使用u => new UserViewModel{}。祝你好运。

    【讨论】:

    • 为什么我们不只是在视图模型中使用构造函数?
    • @Java_Amiry 如何返回非单个列表
    • @SAR 只需将.Single() 方法替换为.ToList() 一个
    • @Javad_Amiry 我试过它应该可以工作,但对我来说不是
    • @farshad 不。这是大多数编码人员的常见误解。 'ToList' 使 ef 建立最终查询并将其发送到 db,并仅加载您在查询中询问的内容。别担心。使用它。
    【解决方案2】:

    有很多方法可以完成这项工作,但使用Automapper NuGet 包是我经历过的最简单的一种。

    • 首先:从 NuGet 包资源管理器为您的项目安装 Autmapper NuGet 包。
    • 第二个:制作一个简单的ViewModel,其中只包含必需的属性:

      public class UserViewModel {
          public int ID {get; set;}
          public string FirstName {get; set;}
          public string LastName {get; set;}
      }
      
    • 第三次:仅在 app_start 类中初始化您的映射器一次,例如:

      namespace SampleProject.App_Start {
          public class AutoMapperConfig {
              public static void Initializer() {
                  AutoMapper.Mapper.Initialize(cfg => {
      
                      cfg.CreateMap<User, UserViewModel>()
                  });
               }
           }
      }
      
    • 第四个:在Global.asax.cs中添加它的条目:

      namespace SampleProject
      {
          public class MvcApplication : System.Web.HttpApplication
          {
              protected void Application_Start()
              {
                  AreaRegistration.RegisterAllAreas();
                  GlobalConfiguration.Configure(WebApiConfig.Register);
                  FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                  RouteConfig.RegisterRoutes(RouteTable.Routes);
                  BundleConfig.RegisterBundles(BundleTable.Bundles);
      
                  // AutoMapper Initializer
                  App_Start.AutoMapperConfig.Initializer();
              }
          }
      }
      
    • 第五种:在控制器中使用它,如下所示:

      namespace SampleProject.Controllers
      {
          public class UsersController : Controller
          {
              private DataContext db = new DataContext();
      
              public ActionResult Index()(
                  var model = AutoMapper.Mapper.Map<List<UserViewModel>>(db.User.ToList());
                  return View(model);
      
              }
          }
      }
      
    • 最后:您可以在 ModelsViewModels 之间创建任意数量的地图,方法是在 app_startAutoMapperConfig 类中初始化一次并使用只需一行简单的代码即可将它们放在您想要的位置。

    如果你搜索它,你也可以找到很多关于Automapper 的帮助。它的主要网站是here




    重要:

    我是ASP.NET MVC 5 的开发人员。 Automapper 每次都适合我。我无法在MVC 3 或早于MVC 5 上查看它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-18
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      相关资源
      最近更新 更多