AutoMapper如何全域性配置map條件過濾null值空值對所有對映起效
我們在使用Automapper
的時候經常會遇到這樣的問題:假設展示給使用者的資料我們用UserDto
類,User
類就是我們的實體類。在給使用者編輯的時候,我們可能某些欄位在資料庫中為Null
,這時候需要一些預設值 比如這裡UserDto
中的BirTime
,然後我們有一些人的習慣是在建構函式裡面進行賦值
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime? BirTime{ get; set; }
}
public class UserDto
{
public UserDto()
{
this.BirTime=DateTime.Now;//把當前時間賦值給BirTime
}
public string Name { get; set; }
public DateTime? BirTime{ get; set; }
}
//假設我們從資料庫中取出來的值是這樣的,然後我們要和UserDto之間進行轉換
User user = new User()
{
Id = 1,
Name = "caoyc",
BirTime=null
};
UserDto userDto=user.MapTo<UserDto>();//這裡把實體類轉換成前臺給使用者展示的UserDto類
看似這裡的程式碼都沒有什麼問題,但是我想在BirTime
為null
值的時候使用我UserDto
類中的預設值 也就是當前時間,但在實際操作之後就會發現轉換過後的UserDto
的值已經變掉了。那麼問題來了, 如何才能使用預設值呢。
方法有很多,比如
//第一種方法
UserDto userDto=user.MapTo<UserDto>();//這裡把實體類轉換成前臺給使用者展示的UserDto類
userDto.BirTime=userDto.BirTime==null?DateTime.Now:userDto.BirTime;
第一種方法就是在自己轉換完成之後判斷一下,然後重新賦值,用這種方法的話那寫建構函式自然就沒什麼必要了
//第二種方法
Mapper.CreateMap<User, UserDto>().ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));
第二種方法不怎麼好,當你需要轉換的類很多的時候,每個都要這樣寫,會很多也會很煩
//第三種方法,在全域性配置的時候加上這句話
private static void CreateMappingsInternal(IMapperConfigurationExpression cfg)
{
//沒錯就是這句話
cfg.ForAllMaps((a, b) => b.ForAllMembers(opt => opt.Condition((src, dest, sourceMember) => sourceMember != null)));
}
個人比較推薦第三種方法,不過這就相當於一棒子打死了,有利也有弊。
AutoMapper條件對映實戰
//有條件的物件拷貝
AutoMapper.Mapper.Initialize(cfg =>
{
cfg.CreateMap<OrderInfo, OrderInfo>()
.ForAllMembers(opts => opts.Condition((src, dest, srcMember, dMember) =>
srcMember != null && srcMember.ToString() != ""));
});
AutoMapper.Mapper.Map<OrderInfo, OrderInfo>(mainOrder, myorderinfo);
AutoMapper.Map
忽略來自源物件中的所有空值的屬性
using AutoMapper;
using NUnit.Framework;
namespace Tests.UI
{
[TestFixture]
class AutomapperTests
{
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int? Foo { get; set; }
}
[Test]
public void TestNullIgnore()
{
Mapper.CreateMap<Person, Person>()
.ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));
var sourcePerson = new Person
{
FirstName = "Bill",
LastName = "Gates",
Foo = null
};
var destinationPerson = new Person
{
FirstName = "",
LastName = "",
Foo = 1
};
Mapper.Map(sourcePerson, destinationPerson);
Assert.That(destinationPerson,Is.Not.Null);
Assert.That(destinationPerson.Foo,Is.EqualTo(1));
}
}
相關文章
- mybatis配置:map查詢空值返回MyBatis
- .NET Core Dto對映(AutoMapper)APP
- 如何過濾掉 PHP 陣列中的空值?PHP陣列
- RedisTemplate清空所有鍵值對Redis
- Javascript - 物件對映automapper介紹JavaScript物件APP
- lambda匿名函式sorted排序函式filter過濾函式map對映函式函式排序Filter
- 【C#】-對於Null值的處理方法C#Null
- mysql 空值(null)和空字元('')的區別MySqlNull字元
- 對存在空值的列建索引索引
- mysql中null與“空值”的坑MySqlNull
- 資料庫系統 空值 null資料庫Null
- vit的線性對映過程
- 條件過濾檢索
- .NET CORE 中使用AutoMapper進行物件對映APP物件
- [譯] part 13: golang 對映 mapGolang
- PHP轉Go系列:map對映PHPGo
- python中if條件語句對於布林值和非布林值的判斷結果Python
- 如何將資料庫中json格式的列值對映到java物件的屬性中資料庫JSONJava物件
- GO語言————8.6 將 map 的鍵值對調Go
- ASP.NET Core 中的物件對映之 AutoMapperASP.NET物件APP
- .NET CORE AUTOMAPPER 對映一個類的子類APP
- 【5min+】 物件對映只有AutoMapper?試試Mapster物件APP
- .Net MVC中定義全域性過濾器及在Action中排除全域性過濾器MVC過濾器
- MapStruct屬性對映Struct
- Nginx埠對映配置Nginx
- 使用Java Stream,提取集合中的某一列/按條件過濾集合/求和/最大值/最小值/平均值Java
- SpringBoot整合Jpa對資料進行排序、分頁、條件查詢和過濾Spring Boot排序
- 【NULL】Oracle null值介紹NullOracle
- [譯] 原始碼對映(Source Map)簡介原始碼
- MyBatis(四) 對映器配置(自動對映、resultMap手動對映、引數傳遞)MyBatis
- .NetCore——全域性異常過濾器ExceptionFilterAttributeNetCore過濾器ExceptionFilter
- Vue定義全域性過濾器filterVue過濾器Filter
- 面試題:對NotNull欄位插入Null值 有啥現象?面試題Null
- laravel-query-builder 對於欄位 值為 null的排序方式LaravelUINull排序
- Util應用框架基礎(二) - 物件到物件對映(AutoMapper)框架物件APP
- python字典如何刪除鍵值對Python
- 如何在es中查詢null值Null
- 物件轉json字串的過程中對value為null的值的一些處理物件JSON字串Null