如何从 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 Express
和EF 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;
现在,您只想获取 ID
、FirstName
、LastName
和 FotherName
。您可以通过 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 包是我经历过的最简单的一种。
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);
最后:您可以在 Models
和 ViewModels
之间创建任意数量的地图,方法是在 app_start
的 AutoMapperConfig
类中初始化一次并使用只需一行简单的代码即可将它们放在您想要的位置。
如果你搜索它,你也可以找到很多关于Automapper
的帮助。它的主要网站是here。
重要:
我是ASP.NET MVC 5
的开发人员。 Automapper
每次都适合我。我无法在MVC 3
或早于MVC 5
上查看它。
【讨论】:
以上是关于如何从 EF 中的表中仅选择某些字段的主要内容,如果未能解决你的问题,请参考以下文章