C# 返回多余无用数据的实体框架

C# 返回多余无用数据的实体框架,c#,entity-framework-6,C#,Entity Framework 6,我在我的项目中使用实体框架。.edmx模型文件中有3个表: 带有以下两列的表类别主数据: * Category_id (int, primary key) * Category_Name (nvarchar) 还有另外两个表子类别\u主控和问题\u主控。两者都有一个FKCategory\u id,该id链接到Category\u Master的PK 我的问题是当我访问数据时 dt = context.Category_Master.ToList().ToDataTable(); 它应该只从类

我在我的项目中使用实体框架。
.edmx
模型文件中有3个表:

带有以下两列的表
类别主数据

* Category_id (int, primary key)
* Category_Name (nvarchar)
还有另外两个表<代码>子类别\u主控和<代码>问题\u主控。两者都有一个FK
Category\u id
,该id链接到
Category\u Master
PK

我的问题是当我访问数据时

dt = context.Category_Master.ToList().ToDataTable();
它应该只从
类别(主控)
表返回数据,但我得到的是两个额外的列
问题(主控)
子(主控)
,其值类型为
系统。集合

这会导致问题,因为这是一个api,并且由于不需要的值而失败

尽管我使用下面的方法解决了这个问题

dt = context.Category_Master.Select(x => new
            {
                Category_id = x.Category_id,
                Category_Name = x.Category_Name
            }).ToList().ToDataTable();
这只返回所需的值,但在将来的情况下,如果我们需要在表中添加额外的列,则此处将需要调整新列。在这种情况下,我不想这样做,我也不想将ado.net与
select*from table
语句一起使用。那么,如何使用下面的快照这样的实体框架仅获取类别主数据呢

更新一个

下面是自动生成的
Category\u master.cs类

public partial class Category_Master
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Category_Master()
    {
        this.Question_Master = new HashSet<Question_Master>();
        this.Sub_Category_Master = new HashSet<Sub_Category_Master>();
    }

    public int Category_id { get; set; }
    public string Category_Name { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Question_Master> Question_Master { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Sub_Category_Master> Sub_Category_Master { get; set; }
}

返回DTO对象,而不是返回实体:

public class CategoryDTO
{
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
}
您可以使用AutoMapper将实体映射到DTO类,如下所示:

CreateMap<Category, CategoryDTO>()
    .ForMember(q => q.CategoryName, w => w.MapFrom(e => e.Category_Name))
    .ForMember(q => q.CategoryId, w => w.MapFrom(e => e.Category_Id));
CreateMap()
.ForMember(q=>q.CategoryName,w=>w.MapFrom(e=>e.Category\u Name))
.ForMember(q=>q.CategoryId,w=>w.MapFrom(e=>e.Category_Id));
通过使用,您可以通过以下方式查询数据库:

context.Category_Master.ProjectToList<CategoryDTO>();
context.Category_Master.ProjectToList();

将数据返回到对象,而不是返回实体:

public class CategoryDTO
{
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
}
您可以使用AutoMapper将实体映射到DTO类,如下所示:

CreateMap<Category, CategoryDTO>()
    .ForMember(q => q.CategoryName, w => w.MapFrom(e => e.Category_Name))
    .ForMember(q => q.CategoryId, w => w.MapFrom(e => e.Category_Id));
CreateMap()
.ForMember(q=>q.CategoryName,w=>w.MapFrom(e=>e.Category\u Name))
.ForMember(q=>q.CategoryId,w=>w.MapFrom(e=>e.Category_Id));
通过使用,您可以通过以下方式查询数据库:

context.Category_Master.ProjectToList<CategoryDTO>();
context.Category_Master.ProjectToList();

如果您不想与AutoMapper和DTO打交道,可以使用:

PM>安装软件包Microsoft.Data.OData

公共类类别控制器:ODataController
{
私有只读YourDbContext\u ctx;
公共类别控制器(YourDbContext ctx)
{
_ctx=ctx;
}        
[启用查询]
公共IQueryable Get()
{
返回_ctx.Category_Master;
}
}
请求仅选择类别ID和类别名称:

GET/odata/Category?$select=Category\u Name,Category\u Id


如果您不想与AutoMapper和DTO打交道,可以使用:

PM>安装软件包Microsoft.Data.OData

公共类类别控制器:ODataController
{
私有只读YourDbContext\u ctx;
公共类别控制器(YourDbContext ctx)
{
_ctx=ctx;
}        
[启用查询]
公共IQueryable Get()
{
返回_ctx.Category_Master;
}
}
请求仅选择类别ID和类别名称:

GET/odata/Category?$select=Category\u Name,Category\u Id

已经有一个类(在edmx文件下)与CategoryTo具有相同的签名,这种方法我必须为每个表复制类。已经有一个类(在edmx文件下)与CategoryTo具有相同的签名,这种方法我必须为每个表复制类