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

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

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

public class ActivityUserService : RepositoryBase<ActivityUser>, IActivityUserService
{

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

}

}


但如果是需要多表联合查询,这个子类怎么写?必竟子类查询的时候是把自己对应的表结构的实体传过去的。多表联合查询时,也不能传多个实体吧。问题比较弱,请各位指点
...全文
390 7 打赏 收藏 转发到动态 举报
写回复
用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")来查询
项目是基于ASP.NET的Web应用程序开发,旨在构建一个高性能、可扩展和可靠的在线平台。我们将使用ASP.NET MVC框架和C#编程语言来实现这个项目。 ASP.NET MVC是一种成熟的开发框架,它采用模型-视图-控制器的设计模式,将应用程序的逻辑和界面分离,提供了更好的代码组织和可维护性。我们选择ASP.NET MVC框架是因为它具有良好的可扩展性和灵活性,可以轻松地添加新功能和模块。 在技术方案上,我们将采用以下几个关键技术: 数据库集成:我们将使用Entity Framework作为ORM(对象关系映射)工具,与数据库进行集成。Entity Framework提供了一种简单且强大的方式来访问和操作数据库,可以大大简化数据访问层的开发工作。 安全性保护:我们将使用ASP.NET提供的身份验证和授权功能,确保只有经过授权的用户可以访问敏感数据和功能。我们还将使用加密技术来保护用户的敏感信息,如密码和支付信息。 缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程模型来处理并发请求和长时间运行的任务。这将提高应用程序的并发能力和响应性能,确保用户在高负载情况下仍然能够流畅地使用应用程序。 性能优化:我们将使用一系列性能优化技术来提高应用程序的性能。这包括使用高效的算法和数据结构、使用缓存技术和数据库索引、进行代码优化和资源管理等。 通过采用这些技术方案,我们的项目将能够提供一个高性能、可扩展和可靠的Web应用程序。我们将遵循最佳的软件开发实践,进行系统测试和性能测试,以确保应用程序的质量和稳定性。

62,025

社区成员

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

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

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

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