应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

abp vnext导航属性,级联查询。abp vnext 通用仓储 级联查询不到数据。abp vnext 多表查询,join

10468人阅读 2022/7/24 22:42 总访问:5182561 评论:0 收藏:1 手机
分类: .NET Core

使用abp vnext的导航属性做级联查询,当然你可以使用自定义仓储,直接用原生的ef来写,也很简单方便
abp vnext自定义仓储里边可以使用GetDbContextAsync()拿到上下文对象,那直接使用原生ef几个,代码如下:

  1. public async void Test()
  2. {
  3. var dbContext = await GetDbContextAsync();
  4. var xx = dbContext.UserInfo.Include("UserDetails").ToList();
  5. }

如果想在通用仓储里边使用级联查询,可能最开始会这样用
就是直接调用GetListAsync,里边传递一个true

  1. public async Task<List<UserInfoDto>> GetListAsync()
  2. {
  3. List<UserInfo> userInfos = await _userinfoRepository.GetListAsync(true);
  4. List<UserInfoDto> result = ObjectMapper.Map<List<UserInfo>, List<UserInfoDto>>(userInfos);
  5. return result;
  6. }

但是这样是查询不出来导航属性的,你需要配置一下级联查询关联的对象。感觉这样很麻烦哇,使用一个还要这样去配置一下。

  1. //默认的级联查询配置
  2. Configure<AbpEntityOptions>(options =>
  3. {
  4. options.Entity<UserInfo>(DemandOrderOptions =>
  5. {
  6. DemandOrderOptions.DefaultWithDetailsFunc = query => query.Include(o => o.UserDetails);
  7. });
  8. });

我们可以使用封装的WithDetails或者是WithDetailsAsync方法
当然还是推荐使用异步方法。代码如下,这个方法就封装得比较灵活了

  1. public async Task<List<UserInfoDto>> GetListAsync()
  2. {
  3. //使用通用仓储的封装的级联查询
  4. List<UserInfo> userInfos = (await _userinfoRepository.WithDetailsAsync(a => a.UserDetails)).ToList();
  5. List<UserInfoDto> result = ObjectMapper.Map<List<UserInfo>, List<UserInfoDto>>(userInfos);
  6. return result;
  7. }

就是使用WithDetailsAsync在里边使用lamdba指定需要级联查询的实体,比如这样(a => a.UserDetails),就是关联查询出来UserDetails实体,很方便的。但是要注意一定要指定一下哦,不然不会默认把导航属性查询出来的,不是懒加载形式,而是直接不加载。


如果是要一次性关联多个表,往后面继续点就行了。
WithDetailsAsync(a => a.UserDetails, a => a.UserDetails))

  1. public async Task<List<UserInfoDto>> GetListAsync()
  2. {
  3. //使用通用仓储的封装的级联查询-关联多个表
  4. List<UserInfo> userInfos = (await _userinfoRepository.WithDetailsAsync(a => a.UserDetails, a => a.UserDetails)).ToList();
  5. List<UserInfoDto> result = ObjectMapper.Map<List<UserInfo>, List<UserInfoDto>>(userInfos);
  6. return result;
  7. }


如果是要一次性关联多个表,并且是子对象中的子对象。其实也是往下面继续点就可以了
WithDetailsAsync(a => a.UserDetails, a => a.UserDetails))

  1. _fileManagerRepository.WithDetailsAsync(a => a.UserInfo,a=>a.UserInfo.Department)

只要有导航属性在,一条链路全部查询出来,直接往下级点就行了,无限套娃,要注意一下效率问题。

这种级联查询之后如果需要用到AutoMapper需要涉及到子对象的情况可以这样配置:

更多情况可以参考
https://www.tnblog.net/aojiancc/article/details/7573


众所周知在EF 6 及以前的版本中,是支持懒加载(Lazy Loading)的,可惜在EF Core 并不支持,必须使用Include方法来支持导航属性的数据加载。不过现在EF Core的开发团队打算恢复对这一功能的支持(目前还未发布,不过可以在Github上面下载进行测试)。

懒加载也可以叫做按需加载、延迟加载。可以分两方面来理解,一方面指暂时不需要该数据,不用在当前马上加载,而可以推迟到使用它时再加载

abp vnext 中实现多表查询和join,可以直接通过通用仓储来
代码如下:

  1. public async void TestJoin()
  2. {
  3. var queryable = (from fileManager in await _fileManagerRepository.GetQueryableAsync()
  4. join fileType in await _fileTypeRepository.GetQueryableAsync() on fileManager.FileTypeId equals fileType.Id
  5. select new
  6. {
  7. fileName = fileManager.FileName,
  8. fileTypeName = fileType.FileTypeName
  9. });
  10. var reuslt = queryable.ToList();
  11. }

这个和直接使用原生ef实现join其实是一个意思,原生ef通过上下文点出来的实体是一个DbSet:

而DbSet其实本身也是IQueryable,所以通过GetQueryableAsync()获取到实体的IQueryable对象当然也可以直接join了


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

EF多种更新方法。EF修改Entity Framework修改。abp vnext ef 更新封装

[TOC] 方法1:直接执行更新的sql语句过于简单不说了 方法2:先查询在更新Users result = oapEntities.Users.Where(a =&gt...

EF添加。Entity Framework添加。abp vnext ef 添加批量添加的封装

EF的添加如下,代码比较添加: ShipEntities se = new ShipEntities(); se.Users.Add(user); se.SaveChanges(); 方法2:...

领域驱动设计DDD abp vnext 一:项目架构搭建模块使用

[TOC]用户接口层改造nuget中下载abp依赖VoLo.Abp.AspNetCore.Mvc ItemGroup添加方式 &lt;ItemGroup&gt; &lt;Packa...

abp vnext ObjectMapper 为空

abp vnext ObjectMapper 报空引用的错。System.NullReferenceException:“Object reference not set to an instance of an ...

领域驱动设计DDD abp vnext 二:使用仓储

[TOC]领域驱动设计仓储介绍在领域层和数据映射层之间进行中介,使用类似集合的接口来操作领域对象.” (Martin Fowler)。 实...

abp vnext 通用仓储操作空引用。abp vnext 仓储报错仓储为空。依赖注入报错

An internal error occurred during your request! abp vnext 通用仓储依赖注入拿到为空,或者能正常拿到依赖注入操作空引...

领域驱动设计DDD abp vnext 三:领域模型 之 失血模型贫血模型充血模型胀血模型

[TOC]领域模型分为:失血模型,贫血模型,充血模型,胀血模型。 一、失血模型传统的三层架构,实体对象就是简单的POJO或者...

abp vnext连接mysql。.net core连接mysql。ef core连接mysql

增加一个MySQL的库:Volo.Abp.EntityFrameworkCore.MySQL &lt;PackageReference Include=&quot;Volo.Abp.EntityFrameworkCo...

abp vnext ef core连接MySql报空引用错连接SqlServer报空引用错。abp vnext 的坑

使用abp vnext 真的太喜欢报空引用的错了。你报点错给一点具体的错不行么,这样搞起让人去猜太坑了,比如前面的auto_fac没...

abp vnext项目结构分析

Domain 项目领域层,领域驱动开发的核心层。 它主要包含 实体, 集合根, 领域服务, 值类型, 仓储接口 和解决方案的其他领域...

abp vnext 实体的guid主键

Guid主键的实体如果你的实体Id类型为 Guid,有一些好的实践可以实现: 创建一个构造函数,获取ID作为参数传递给基类.— 如...

abp vnext 获取配置文件

代码如下: public override void ConfigureServices(ServiceConfigurationContext context) { var services = cont...

abp vnext验证

验证DTO微软官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/validation?view=aspnetcore-7.0 数据注...

abp vnext 通用仓储 ef core。WhereIf多条件动态条件分页动态排序等

abp vnext 通用仓储 ef core WhereIf,多条件,分页等public async Task&lt;List&lt;LandInfoDto&gt;&gt; GetListAsync(Pag...

abp vnext 事务多表查询自定义仓储

[TOC]abp vnext 中的通用仓储主要是封装的单表操作,如果是实现事务的话最好还是封装一个自定义仓储。 自定义仓储大概的结...