📅  最后修改于: 2023-12-03 15:14:50.952000             🧑  作者: Mango
在 C# 中,Entity Framework (EF) 提供了多种选择多个项目的方式。在本文中,我们将介绍其中的几种方法和这些方法的优缺点。
使用匿名类型选择多个属性是最简单的选择多个项目的方法之一。例如,如果我们使用 EF 访问一个“客户”实体对象:
using (var context = new MyDbContext())
{
var customer = context.Customers.FirstOrDefault(c => c.Id == 1);
// ...
}
我们可以使用匿名类型选择实体对象中的多个属性:
using (var context = new MyDbContext())
{
var customer = context.Customers
.Where(c => c.Id == 1)
.Select(c => new { c.Name, c.Email, c.Address })
.FirstOrDefault();
// ...
}
在这个例子中,我们只选择了“Name”、“Email”和“Address”属性。选择多个属性时,我们必须构造一个新的匿名类型来对这些属性进行选择。使用匿名类型选择多个属性时,它们将以只读方式返回。这意味着您不能通过 EF 更新这些属性和对象操作仅限于此匿名类型。
如果您需要选择实体类型的多个属性,并且需要根据这些属性更新实体对象,则可以使用模型映射方式。这种方式需要 EF 的一些配置和模型中的属性映射。例如,如果我们有一个“Customer”实体类型:
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Address { get; set; }
}
我们可以创建一个新类型来仅在查询中使用该实体的部分属性:
public class CustomerBrief
{
public string Name { get; set; }
public string Email { get; set; }
public string Address { get; set; }
}
然后我们可以在 DbContext 的 OnModelCreating 方法中配置这个新类型:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>()
.HasKey(c => c.Id)
.ToTable("Customers");
modelBuilder.ComplexType<CustomerBrief>();
modelBuilder.Entity<Customer>()
.Map(m => m.Properties(c => new { c.Name, c.Email, c.Address }))
.ToTable("Customers");
base.OnModelCreating(modelBuilder);
}
以这种方式配置模型后,我们可以使用映射的实体类型:
using (var context = new MyDbContext())
{
var customer = context.Customers
.Where(c => c.Id == 1)
.Select(c => c.Brief)
.FirstOrDefault();
customer.Name = "New Name"; // update property
context.SaveChanges(); // save changes to database
// ...
}
在这个例子中,我们选择了“Name”、“Email”和“Address”属性,并且这三个属性都映射到新类型“CustomerBrief”的属性中。使用这种方式,我们可以在查询时只选择实体类型的部分属性,同时我们还能方便地更新这些属性并将更新保存回数据库。
本文介绍了使用 EF 实现选择多项项目的两种方法:使用匿名类型和使用模型映射实体类型。使用匿名类型是最简单的方式,而使用模型映射实体类型可以让我们选择实体类型的部分属性并且方便地更新这些属性。这些方法都有各自的优缺点,我们应该根据情况来选择最适合的方法。
参考资料:https://docs.microsoft.com/en-us/ef/ef6/querying/complex-types