如何从EF中的表中选择一些字段

时间:2011-09-09 01:12:18

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

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

请问如何使用Entity Framework 4执行此操作?

e.g。我的表格包含以下字段:

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

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

ID, FirstName, LastName

我的项目是ASP.NET MVC 3个应用,SQLServer 2008 ExpressEF 4.1

2 个答案:

答案 0 :(得分:27)

假设您有一个包含此模型的表:

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;

以另一种方式(例如,当您希望将> > > > > )时,您可以定义一个新的class,(即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{}。祝你好运。

答案 1 :(得分:0)

有很多方法可以完成这项工作,但使用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_start&#中初始化一次39; s AutoMapperConfig类,并使用简单的代码行在任意位置使用它们。

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

重要:

我是ASP.NET MVC 5的开发人员。 Automapper每次都适合我。我无法在MVC 3MVC 5之前检查它。