c# - EntityFramework Core 3 和 Automapper。包含在过滤器中
问题描述
我正在尝试使用 EFC3 从 IQueryable 执行 automapper ProjectTo<> 调用。我的对象有一些导航属性,我需要这样检索,但其他一些我需要使用 Where 子句进行过滤。
我可以通过 3 个数据库调用来实现它
var dto = _context.Bonds.Where(x => x.Id == request.Id). ProjectTo<BondDto>(_mapper.ConfigurationProvider) // Mapping is done here .FirstOrDefaultAsync(cancellationToken); var price = _context.MarketDatas.OfType<RatingMarketData>() .Where(x => x.Date == request.Date && x.AssetId == request.Id) .ProjectTo<RatingMarketDataDto>(_mapper.ConfigurationProvider) .FirstOrDefaultAsync(cancellationToken); var rating = ... same than for price
1 个数据库调用,包含很多我不喜欢的包含和映射
var vm = _context.Bonds .Include(x => x.CallSchedule) .Include(x => x.PutSchedule) .Include(x => x.FixedCouponSchedule) .Include(x => x.FloatingCouponSchedule) .Include(x => x.RedemptionSchedule) // If I don't Include I don't get nested objects like ProjectTo<> .Where(x => x.Id == request.Id) .Select(b => new BondVm { BondDto = _mapper.Map<BondDto>(b), RatingDto = _mapper.Map<RatingMarketDataDto>(b.MarketDatas.OfType<RatingMarketData>() .OrderByDescending(x => x.Date) .FirstOrDefault(x => x.AssetId == request.Id && x.Date <= request.Date)), PriceDto = _mapper.Map<PriceMarketDataDto>( b.MarketDatas.OfType<PriceMarketData>() .FirstOrDefault(x => x.Date == request.Date && x.AssetId == request.Id)) }) .FirstOrDefaultAsync(cancellationToken);
1 次数据库调用而不使用 Automapper。很多手动映射和丑陋的代码。这正是我想要实现的目标,但我想使用 Automapper projectTo<<>> 的强大功能。
var vm = await _context.Bonds .Where(b => b.Id == request.Id) .Select(bond => new { Bond = new BondDto { Id = bond.Id.ToString(), Currency = bond.Currency, BorrowerClass = bond.BondSector.BorrowerClass, CouponFrequency = bond.CouponFrequency, AccruedDayCount = bond.AccruedDayCount, CallScheduleStyle = bond.CallScheduleStyle, CorrelatedResidual = bond.CorrelatedResidual, IsPerpetual = bond.IsPerpetual, Issuer = bond.Issuer, IssuerSeniority = bond.IssuerSeniority, Maturity = bond.Maturity, CallSchedule = bond.CallSchedule.Select(s => _mapper.Map<CallScheduleItemDto>(s)).ToList(), FixedCouponSchedule = bond.FixedCouponSchedule.Select(s => _mapper.Map<FixedCouponScheduleItemDto>(s)).ToList(), RedemptionSchedule = bond.RedemptionSchedule.Select(s => _mapper.Map<RedemptionScheduleItemDto>(s)).ToList(), PutSchedule = bond.PutSchedule.Select(s => _mapper.Map<PutScheduleItemDto>(s)).ToList(), FloatingSpreadSchedule = bond.FloatingSpreadSchedule.Select(s => _mapper.Map<FloatingSpreadScheduleItemDto>(s)).ToList(), }, Price = _mapper.Map<PriceMarketDataDto>(bond.MarketDatas.OfType<PriceMarketData>() .FirstOrDefault(p => p.Date == request.Date && p.AssetId == request.Id)), Rating = _mapper.Map<RatingMarketDataDto>(bond.MarketDatas.OfType<RatingMarketData>() .OrderByDescending(x => x.Date) .FirstOrDefault(x => x.AssetId == request.Id && x.Date <= request.Date))}) .FirstOrDefaultAsync(cancellationToken);
我想要实现的是使用 ProjectTo<<'BondVm'>> 的 1 个数据库调用
var vm = _context.Bonds
.Where(x => x.Id == request.Id)
.ProjectTo<BondVm>(_mapper.ConfigurationProvider);
这是 BondVM 以防万一:
public class BondVm
{
public BondDto BondDto { get; set; }
public RatingMarketDataDto RatingDto { get; set; }
public PriceMarketDataDto PriceDto { get; set; }
}
并且能够以上述条件过滤我的 2 个导航属性(评级和价格)。我不知道如何过滤我的映射配置文件
如果您需要更多信息,请与我们联系。非常感谢您的帮助!
编辑:
关于 Lucian Bargaoanu 的建议,这是我的映射配置文件:
public BondVmMapper()
{
Map.ForMember(d => d.BondDto, o => o.MapFrom(x => x));
Map.ForMember(d => d.PriceDto, o => o.MapFrom(s => s.MarketDatas.OfType<PriceMarketData>()));
Map.ForMember(d => d.RatingDto, o => o.MapFrom(s => s.MarketDatas.OfType<RatingMarketData>()));
}
奇怪的是,我们将 Enumerable 映射到单个对象上,这应该如何工作?
解决方案
推荐阅读
- salt-stack - 从 salt master 复制文件并在 minion 上执行
- python - Tensorflow 中的子张量相等错误
- c - Redis 为什么会保存部分数据集?
- triggers - 触发器测试类的测试覆盖率不断显示 53
- php - PHP 7.x SQLITE3 PDO - execute() 是否关闭了 PDO 连接?
- submenu - 我们可以在 react-admin 中为用户、帖子和仪表板添加子菜单吗?如果可以,我们如何添加?
- linux - top 命令在linux中是如何工作的?它如何提供实时输出?
- amazon-web-services - 如何在同一 AWS EB 应用程序中托管基于不同版本的路由
- elasticsearch - ElasticSearch 日期范围查询不适用于自定义日期格式
- javascript - 从我的 React 组件中的文本中打印字母,就像旧的视频游戏一样