【问题标题】:SQL Server query creating different return typesSQL Server 查询创建不同的返回类型
【发布时间】:2016-03-18 16:36:04
【问题描述】:

我将直接使用代码,然后解释我的问题,这样会更容易。提醒一下,我将实体框架 7 与 SQL Server 2014、ASP.NET 5 和 MVC 6 结合使用。

所以,我有以下课程:

public class Base {
    public int BaseId { get; set; }
    public string Name { get; set; }
}
public class DerivedOne : Base { 
    public virtual List<OtherDBObject> ListOne { get; set; }  
}
public class DerivedTwo : Base {
    public string SomeContent { get; set; }
}

我创建了从数据库中检索 Base 对象的存储库。问题是,DerivedOne 和 DerivedTwo 有不同的成员 - 我怎么知道要返回哪种类型(要进一步查询哪些成员)?

public class Repo : IRepo {
    public async Task<Base> GetById(int id) {
        // I though that this method should work something like this (its pseudo code) :
        context.Base.Where(b => b.BaseId == id)
            .switch(obj.type) {
                case DerivedOne : query for OtherDBObjects
                case DerivedTwo : query for string content somewhere else
                ...
            }).First();
    }
}

我的目标是拥有非常抽象的基类,其中只包含几个基本字段,而派生的可以完全不同。

PS 如果您对此任务有不同的结构,请随时发布!

【问题讨论】:

  • 我不太确定您在这里要做什么,但您不能只查询 Base 对象,然后查看获取的对象是 DerivedOne 还是 DerivedTwo 类型?
  • 嗯,是的,但它会被分成两个对数据库的查询——一个是获取 Base 然后检查它的类型,然后查询派生类的内容。我认为一个查询比两个更好 - 更少的开销。
  • 基于对象类型检查的控制流 = 非常糟糕的设计。
  • @E-Bat 我知道,这就是我问的原因。你有什么建议吗?

标签: c# asp.net .net entity-framework asp.net-core-mvc


【解决方案1】:

您可以使用泛型和扩展方法编写好东西,如下所示:

public static Task<TEntity> GetByIdAsync<TEntity>( 
    this DbSet<TEntity> set, int id)  where TEntity : Base
{
    return set.FirstOrDefaultAsync(e => e.Id == id);
}

示例用法:

DerivedOne entity = await DbContext.DerivedOnes.GetByIdAsync(id);

【讨论】:

  • 如果我在查询数据库之前知道实体的类型,我会这样做。我只想像'api/lesson/id'一样调用api,结果将是带有所有相应成员的类型。我的数据库几乎总是只读的 - 您如何看待将静态、预先创建的内容存储在某个键值(我正在使用 Azure,所以选择 TableStorage)中,其中键只是 id?
  • 那个方法事先不知道你要查询什么类型。在您的课程控制器/索引操作中,您可以使用示例用法语法指定具体类型。
  • 我不知道我是否说清楚:我只将 ID 传递给数据库,在查询返回数据之前我不知道我得到什么类型。因此我需要将其视为基本类型。换句话说:函数里面应该只有'return ..'。类似于: public Base GetById(int id) { return DbContext.Base.GetById(id);如果数据结果是 DerivedType,它应该包括它的成员。
  • 但是当你请求'api/lesson/id'时,你不知道你要查询一个课程对象吗?
  • 我知道我需要查询课程但我不知道我会得到哪种派生类型,所以查询不知道它应该另外检索哪些外部数据。那是我的想法——我可以通过 id 轻松查询课程,而不知道他们的类型。但我认为这是一个有点复杂的任务,所以我认为对 api/queries 施加一些限制会更容易。正如我所说 - 它几乎总是只读的,所以我将使用预先制作的 JSON 数据将课程放在表存储中。
猜你喜欢
  • 2011-06-24
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 2011-01-17
  • 2016-12-24
相关资源
最近更新 更多