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主控。两者都有一个FKCategory\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具有相同的签名,这种方法我必须为每个表复制类