【问题标题】:Exclude columns getting data with Entity Framework [duplicate]排除使用实体框架获取数据的列[重复]
【发布时间】:2019-05-02 08:37:43
【问题描述】:

我在 C# 中使用实体框架。我想在从数据库获取数据时排除一些列。例如,我的学生表有 10 列。并且表中有一些列,如 CreatedDate、CreatedBy、CreateRole、UpdatedDate、Updatedby、UpdatedRole。我想要在从数据库中获取列表时排除此列的通用解决方案,如下所示。

我正在寻找如下所示的

 context.Students   
.Exclude("CreatedDate","CreatedBy","CreateRole","UpdatedDate","Updatedby","UpdatedRole")
.ToList();

请不要建议以下解决方案,因为这不是我想要的。

context.Students.Select(p=>new {
p.Name,
p.Surname,
p.Number,
p.BirthDate
}).ToList();

【问题讨论】:

  • 您可能也不想为您的模型添加代码。正确的解决方案取决于您的模型中是否包含这些属性。
  • 大多数时候,我不使用这个列。但有时我会使用。所以,我不能从模型中删除。如果我从模型中删除,我无法在需要时访问,例如 CreatedDate 列 @Noceo
  • 我不知道任何干净的方法,只加载一些模型属性,而不总是排除它们(使用[NotMapped] 属性)。您可以将很少使用的属性移动到它们自己的模型中,并将其包含在主模型中(创建一对一的关系)。这样就可以只按需加载这些额外的属性。
  • 感谢您的回复@Noceo
  • 我忘记问的一个重要问题是:为什么有时需要排除这些属性?在大多数情况下,性能损失可能非常小,以至于无法证明增加代码的复杂性是合理的。

标签: c# entity-framework linq


【解决方案1】:

正如我的 cmets 中所述,我将为仅偶尔需要的属性创建一个模型:

public class CreateAndUpdatePropertiesModel
{
    public DateTime CreatedDate { get; set; }
    public string CreatedBy { get; set; }
    public DateTme ModifiedDate { get; set; }
    public string ModifiedBy { get; set; }
    // ...and so on
}

然后将此模型用作我的主要模型中的属性:

public class StudentModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
    // ...rest of the properties here

    // And then add the CreateAndUpdateProperties model as a property
    public CreateAndUpdateProperties { get; set; }
}

然后当你从实体框架中选择项目时,你可以使用

.Include(s => s.CreateAndUpdateProperties)

如果您想包含 create 和 update 属性。如果没有此包含,它将为空。

【讨论】:

  • 非常感谢@Noceo。这是非常有用和有用的信息。它可以解决大多数人的问题。但是,我无法更改我的实体基础设施。因为,我做了很多定制。所以,我会寻找类级别而不是基础级别。
  • 我想你可以为同一个数据库创建两个不同的 EF 上下文。一种加载完整模型,一种仅加载部分模型。这可以通过 FluentAPI 进行控制。但处理起来可能相当棘手。
  • 是的。也可以。再次感谢@Noceo。我找到了适合我情况的解决方案。 AutoMapperProjectTo 方法解决了我的问题。你可以从我的这篇文章中看到。 stackoverflow.com/a/53564646/10176050
【解决方案2】:

您可以如下修改 DBContext。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Students>().Ignore(t=>t.CreatedDate).Ignore(t=>t.CreatedBy).Ignore(t=>t.CreateRole).Ignore(t=>t.UpdatedDate).Ignore(t=>t.Updatedby).Ignore(t=>t.UpdatedRole);

    base.OnModelCreating(modelBuilder);
}

【讨论】:

  • 谢谢@jungosong。我想到了这个解决方案,但是在这种情况下,当我需要 CreatedDate 时,这将是一个问题。
猜你喜欢
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
相关资源
最近更新 更多