我正在為報告工具映射一些資料庫物體。
目前,有一些計算屬性取決于加載的導航屬性。他們已通過 AutoMapper 系結以簡化流程。
public class Customer
{
public long Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Foo> Foos { get; set; }
public virtual ICollection<Bar> Bars { get; set; }
}
public class CustomerDto
{
public long Id { get; set; }
public string Name { get; set; }
public long TotalNumberOfFoos { get; set; }
public long NumberOfBarsWithCondition { get; set; }
}
public class CustomerProfile : Profile
{
public CustomerProfile()
{
CreateMap<Customer, CustomerDto>()
.ForMember(d => d.TotalNumberOfFoos, p => p.MapFrom(c => c.Foos.Count))
.ForMember(d => d.NumberOfBarsWithCondition, p => p.MapFrom(c => c.Bars.Where(b => b.BarProperty == "something").Count()));
}
}
public class CustomerController : Controller
{
public async Task<List<CustomerDto>> CustomersByName(string name)
{
using (var db = new MyDbContext())
{
return await db.Customers
.ProjectTo<CustomerDto>(_mapper.ConfigurationProvider)
.Where(c => c.Name == name).ToListAsync();
}
}
}
當然,隨著資料庫大小的增加,檢索這些屬性的查詢會變得非常昂貴,并且在最終報告中并不總是需要它們。
這個想法是讓用戶選擇他們是否希望將它們包含在最終報告中,但我還沒有找到一種在查詢時使映射成為可選的方法。
有沒有辦法自動執行此操作,或者我是否被迫具體化串列并自己單獨查詢這些屬性,從而失去了從資料庫中計算屬性的優勢?
uj5u.com熱心網友回復:
您需要的是利用所謂的 AutoMapper Explicit 擴展功能。這可能應該被稱為“顯式屬性包含”(不要與Include僅用于導航的EF Core 混合),因為它適用于任何目標屬性,以及它的作用是將其自動包含在生成的投影 ( Select) 中,僅當您明確選擇加入時才包含它。
所以,你首先需要配置這樣的屬性ExplicitExpansion(),例如
CreateMap<Customer, CustomerDto>()
.ForMember(d => d.TotalNumberOfFoos, p =>
{
p.MapFrom(c => c.Foos.Count);
p.ExplicitExpansion();
})
.ForMember(d => d.NumberOfBarsWithCondition, p =>
{
p.MapFrom(c => c.Bars.Where(b => b.BarProperty == "something").Count());
p.ExplicitExpansion();
});
現在默認情況下它們不會被填充。使用 的附加引數ProjectTo傳遞您想要“擴展”(包括)的引數,例如
.ProjectTo<CustomerDto>(_mapper.ConfigurationProvider, e => e.TotalNumberOfFoos)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/328776.html
上一篇:更改asp按鈕行為
