Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server查询创建不同的返回类型_C#_Asp.net_.net_Entity Framework_Asp.net Core Mvc - Fatal编程技术网

C# SQL Server查询创建不同的返回类型

C# SQL Server查询创建不同的返回类型,c#,asp.net,.net,entity-framework,asp.net-core-mvc,C#,Asp.net,.net,Entity Framework,Asp.net Core Mvc,我将直接使用代码,然后解释我的问题,这样会更容易。为了给大家一个提示,我将entity framework 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

我将直接使用代码,然后解释我的问题,这样会更容易。为了给大家一个提示,我将entity framework 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; }
}
公共类基{
public int BaseId{get;set;}
公共字符串名称{get;set;}
}
公共类DerivedOne:Base{
公共虚拟列表列表{get;set;}
}
公共类派生二:基{
公共字符串SomeContent{get;set;}
}
我创建了从数据库中检索基本对象的存储库。问题是,DerivedOne和DerivedTwo有不同的成员-我如何知道返回哪种类型(进一步查询哪些成员)

公共类回购:IRepo{
公共异步任务GetById(int id){
//我认为这个方法应该像这样工作(它的伪代码):
context.Base.Where(b=>b.BaseId==id)
.开关(obj.型){
case-DerivedOne:查询其他数据库对象
案例二:查询其他地方的字符串内容
...
}).First();
}
}
我的目标是让非常抽象的基类只包含几个基本字段,而派生字段可以完全不同


PS如果你对此任务有不同的结构,请随意发布

您可以通过使用泛型和扩展方法编写好的内容,如以下内容:

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

我不确定您在这里要做什么,但您不能只查询基本对象,然后查看获取的对象是DerivedOne还是DerivedTwo类型吗?是的,但它将被分成两个对数据库的查询-一个是获取基本对象,然后检查其类型,然后查询派生类内容。我认为一个查询比两个查询要好——开销要小得多。基于对象类型检查的控制流=非常糟糕的设计。@E-Bat我知道,所以这就是我问的原因。你们有什么建议吗?若我在查询数据库之前知道实体的类型,我会这样做。我只想调用类似“api/lesson/id”的api,结果将是包含所有对应成员的类型。我的数据库几乎都是只读的-您如何看待将静态的、预先创建的内容存储在某个键值中(我使用Azure,所以选择表存储),其中键只是id?该方法不知道您要查询的类型。在您的课程中,控制器/索引操作是使用示例用法语法指定具体类型的地方。我不知道是否已明确说明:我只将ID传递给数据库,在查询返回数据之前,我不知道得到的是什么类型。因此,我需要将其视为基本类型。换句话说:函数内部应该只有'return..'。类似于:public Base GetById(int id){return DbContext.Base.GetById(id);},如果数据是DerivedType,它应该包含它的成员。但是当您请求'api/lesson/id'时,您不知道您想要查询一个lesson对象吗?我知道我需要查询lesson,但我不知道我将得到哪个派生类型,所以查询不知道应该另外检索哪些外来数据。这就是我的想法——我可以通过id轻松地查询课程,而不知道它们的类型。但我看到这是一项有点复杂的任务,所以我认为对api/查询施加一些约束会更容易。正如我所说的,它几乎总是只读的,所以我将使用预先制作的JSON数据将课程放在表存储中。
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);