asp.net mvc 数据库仓储是否可以多表查询?

d383137359 2018-06-21 03:12:52
目前只会一种方式,写一个数据库仓储GRUD基类

创建一个与数据库表结构对应的实体类,写一个子类继承基类去对数据库表进行操作。如下:

public class ActivityUserService : RepositoryBase<ActivityUser>, IActivityUserService
{

public ActivityUserService(IDatabaseFactory databaseFactory)
: base(databaseFactory)
{

}

}


但如果是需要多表联合查询,这个子类怎么写?必竟子类查询的时候是把自己对应的表结构的实体传过去的。多表联合查询时,也不能传多个实体吧。问题比较弱,请各位指点
...全文
405 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 版主 2018-06-22
  • 打赏
  • 举报
回复
引用 5 楼 d383137359 的回复:
[quote=引用 4 楼 hanjun0612 的回复:]
看这个是看不出的,你要看SysUserInfos 对象中,是否有 主外键对象。
比如SysRoles 或者 IConllection<>等等,才能知道你的实体对象是否存在了主外键关系。


没有主外键对象。已经按你上面所说的方法解决。
另外请问,我看到人家项目中,有些模型类里会定义虚拟对象模型。不知道有什么用。或者是查询时怎么给他定义的虚拟对象赋值。这个是不是就是用到主外键映射?如下:


public class SysDepartmentSysUser : DbSetBase
{
[ForeignKey("SysUser")]
public Guid SysUserId { get; set; }

public virtual SysUser SysUser { get; set; }

[ForeignKey("SysDepartment")]
public Guid SysDepartmentId { get; set; }

public virtual SysDepartment SysDepartment { get; set; } //这儿定义的虚拟模型,但这个SysDepartmentSysUser类本身没人继承他。而且我看他查询数据库时,也没给SysDepartment赋值。前面页面用他的属性的地方还多。主页这儿启什么作用呢?
}
[/quote]
public virtual SysDepartment SysDepartment { get; set; }
首先这就是一个关联对象。
其次virtual代表延迟加载。
就是当你使用的时候,采取访问数据库查询数据。
nkc48_2_4_11 2018-06-22
  • 打赏
  • 举报
回复
引用 5 楼 d383137359 的回复:
[quote=引用 4 楼 hanjun0612 的回复:]
看这个是看不出的,你要看SysUserInfos 对象中,是否有 主外键对象。
比如SysRoles 或者 IConllection<>等等,才能知道你的实体对象是否存在了主外键关系。


没有主外键对象。已经按你上面所说的方法解决。
另外请问,我看到人家项目中,有些模型类里会定义虚拟对象模型。不知道有什么用。或者是查询时怎么给他定义的虚拟对象赋值。这个是不是就是用到主外键映射?如下:


public class SysDepartmentSysUser : DbSetBase
{
[ForeignKey("SysUser")]
public Guid SysUserId { get; set; }

public virtual SysUser SysUser { get; set; }

[ForeignKey("SysDepartment")]
public Guid SysDepartmentId { get; set; }

public virtual SysDepartment SysDepartment { get; set; } //这儿定义的虚拟模型,但这个SysDepartmentSysUser类本身没人继承他。而且我看他查询数据库时,也没给SysDepartment赋值。前面页面用他的属性的地方还多。主页这儿启什么作用呢?
}
[/quote]

虚拟对象的作用是关联其他实体,建立虚拟对象之后,做查询时,自动生成的当前表的查询字段会自动添加虚拟字段的主键,如果当前实体没有该外键,语句也会按照EntityName_xx(entity主键名)的格式添加查询字段名,然后导致错误,这种方式codefirst比较好用。
如果有对应的外键字段,该实体下定义的虚拟对象也会被赋值。
d383137359 2018-06-22
  • 打赏
  • 举报
回复
引用 4 楼 hanjun0612 的回复:
看这个是看不出的,你要看SysUserInfos 对象中,是否有 主外键对象。
比如SysRoles 或者 IConllection<>等等,才能知道你的实体对象是否存在了主外键关系。


没有主外键对象。已经按你上面所说的方法解决。
另外请问,我看到人家项目中,有些模型类里会定义虚拟对象模型。不知道有什么用。或者是查询时怎么给他定义的虚拟对象赋值。这个是不是就是用到主外键映射?如下:


public class SysDepartmentSysUser : DbSetBase
{
[ForeignKey("SysUser")]
public Guid SysUserId { get; set; }

public virtual SysUser SysUser { get; set; }

[ForeignKey("SysDepartment")]
public Guid SysDepartmentId { get; set; }

public virtual SysDepartment SysDepartment { get; set; } //这儿定义的虚拟模型,但这个SysDepartmentSysUser类本身没人继承他。而且我看他查询数据库时,也没给SysDepartment赋值。前面页面用他的属性的地方还多。主页这儿启什么作用呢?
}
正怒月神 版主 2018-06-21
  • 打赏
  • 举报
回复
引用 3 楼 d383137359 的回复:
[quote=引用 1 楼 hanjun0612 的回复:]
多表联合查询,
如果不是关联对象查询的话,
那么就自定义Model,然后可以通过 dbcontext.database.sqlquery<自定义model>("sql")来查询


可能是关联对象……悲剧了,请看下面代码,这个是关联吗?

public class SysApplicationDb : DbContext
{
public SysApplicationDb(string nameOrConnectionString) : base(nameOrConnectionString)
{ }

//系统实体
public DbSet<SysMenu> SysMenus { get; set; }
public DbSet<SysRole> SysRoles { get; set; }
public DbSet<SysRolesInfo> SysRolesInfos { get; set; }
public DbSet<SysUserInfo> SysUserInfos { get; set; }
}
[/quote]
看这个是看不出的,你要看SysUserInfos 对象中,是否有 主外键对象。
比如SysRoles 或者 IConllection<>等等,才能知道你的实体对象是否存在了主外键关系。
d383137359 2018-06-21
  • 打赏
  • 举报
回复
引用 1 楼 hanjun0612 的回复:
多表联合查询,
如果不是关联对象查询的话,
那么就自定义Model,然后可以通过 dbcontext.database.sqlquery<自定义model>("sql")来查询


可能是关联对象……悲剧了,请看下面代码,这个是关联吗?

public class SysApplicationDb : DbContext
{
public SysApplicationDb(string nameOrConnectionString) : base(nameOrConnectionString)
{ }

//系统实体
public DbSet<SysMenu> SysMenus { get; set; }
public DbSet<SysRole> SysRoles { get; set; }
public DbSet<SysRolesInfo> SysRolesInfos { get; set; }
public DbSet<SysUserInfo> SysUserInfos { get; set; }
}
d383137359 2018-06-21
  • 打赏
  • 举报
回复
引用 1 楼 hanjun0612 的回复:
多表联合查询,
如果不是关联对象查询的话,
那么就自定义Model,然后可以通过 dbcontext.database.sqlquery<自定义model>("sql")来查询


非常棒,是我没想到的。另外有没有直接子类互相调节筛选的方式?因为这种到时可能会多许多模型出来,但有办法解决了也好
正怒月神 版主 2018-06-21
  • 打赏
  • 举报
回复
多表联合查询,
如果不是关联对象查询的话,
那么就自定义Model,然后可以通过 dbcontext.database.sqlquery<自定义model>("sql")来查询

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧