【问题标题】:Applying Linq to a DbSet inside DbContext将 Linq 应用于 DbContext 中的 DbSet
【发布时间】:2016-03-07 10:28:14
【问题描述】:

假设我有一个名为 Item 的模型,它看起来像这样:

public int ID { get; set; }
public DateTime DateCreated { get; set; }
public DateTime? DateArchived { get; set; }
[Required]
public string Alias { get; set; }

它已被包含在 DbContext...

public DbSet<Item> Items { get; set; }

每当我想从数据库中选择所有项目时,我只想包括 Archived == null 并按 Alias 排序的项目。

当调用 DbSet 时(例如在 DbContext 上),有没有办法设置 EF 来执行此操作?

例如,如果我在控制器中调用 db.Items,我总是希望应用这些选项而不必明确声明它们。

我目前的做法是用前缀“All”重命名 DbSet,并添加一个应用了这些选项的函数(函数使用 DbSet 的原始名称,以便脚手架控制器和页面使用自定义查询而无需任何更改):

public DbSet<Item> AllItems { get; set; }
public IQueryable<Item> Items
{
    get { return AllItems.Where(item => item.Archived == null).OrderBy(item  => item.Alias); }
}

但是这种方法的某些方面让人感觉很老套/错误。这是一个很好的方法吗?这通常应该怎么做?

【问题讨论】:

  • 我不认为这是 hack-ish 或错误的。如果您出于某种原因也需要所有物品怎么办?
  • @我同意@MutantNinjaCodeMonkey。对我来说似乎很好

标签: c# entity-framework


【解决方案1】:

我曾经遇到过类似的问题,我创建了一个数据库视图来呈现我的数据,并带有所有必要的限制。视图可以具有与表相同的字段,但不是必须的。然后创建另一个 DbSet 项,例如DbSet&lt;ItemView&gt;,在数据库中对应于视图而不是表。在此视图中,您可以根据需要声明 where 语句。如果属性相同,您还可以为两个类创建相同的祖先(例如,ItemItemView 都继承自 ItemBase)。

我已经在 MS SQL Server 上完成了这项工作。

【讨论】:

    【解决方案2】:

    我通常避免直接访问 DbSet,并通过将上下文隐藏在接口后面来强制执行此想法。然后我只从接口访问存储库方法。如果您希望客户端代码无权访问表集合(并希望将它们引导到某些过滤的数据子集),则在客户端代码中使用 DbSet 时,这会从智能感知中隐藏 DbSet。

    public interface IDataContext : IDisposable
    {
        void SaveChanges();
        IQueryable<Item> GetItems();
    }
    
    public class DataContext : DbContext, IDataContext
    {
        public DataContext(string connectionStringName) : base(connectionStringName) { }
    
        public DbSet<Item> Items { get; set; }
    
        public IQueryable<Item> GetItems()
        {
            return Items.Where(item => item.Archived == null).OrderBy(item  => item.Alias); 
        }
    }
    
    using (IDataContext context = new DataContext("myConnection"))
    {
        var items = context.GetItems();
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 2016-02-29
      • 2017-01-24
      • 2017-12-10
      相关资源
      最近更新 更多