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

Posted

技术标签:

【中文标题】如何从 EF 中的表中仅选择某些字段【英文标题】:How to select just some fields from a table in 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

【问题讨论】:

【参考方案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 上查看它。

【讨论】:

以上是关于如何从 EF 中的表中仅选择某些字段的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery:如何从重复记录中仅提取某些字段作为另一个重复字段

如何防止从表中已有的值派生的表中的某些值组合?

如何从列中的多条记录中仅选择 3 条记录?

如何在EF6 Code First中创建与枚举对应的表?

如何从多次包含此值的表中仅获取 1 个结果?

如何在 EF / EF Core 中的第二个表上实现具有某些条件的左连接?