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
- 將一個物件裡所有的空值屬性設定成null物件Null
- 如何過濾掉 PHP 陣列中的空值?PHP陣列
- RedisTemplate清空所有鍵值對Redis
- ORACLE SQL過濾條件是IS NULL or !=的優化OracleSQLNull優化
- null(空值)小結Null
- SQL中的空值NULLSQLNull
- 如何使用Java泛型對映不同的值型別Java泛型型別
- .NET Core Dto對映(AutoMapper)APP
- AutoMapper在MVC中的運用05-對映中的忽略、處理null、多種對映轉換APPMVCNull
- lambda匿名函式sorted排序函式filter過濾函式map對映函式函式排序Filter
- Javascript - 物件對映automapper介紹JavaScript物件APP
- 【C#】-對於Null值的處理方法C#Null
- vit的線性對映過程
- 進階篇_map容器(儲存鍵值對)
- Oracle 在連線條件裡處理和比較 NULL 值OracleNull
- 條件過濾檢索
- mysql 空值(null)和空字元('')的區別MySqlNull字元
- [譯] part 13: golang 對映 mapGolang
- PHP轉Go系列:map對映PHPGo
- 資料庫系統 空值 null資料庫Null
- mysql中null與“空值”的坑MySqlNull
- MySQL裡null與空值的辨析MySqlNull
- AutoMapper在MVC中的運用06-一次性定義對映、複雜型別屬性對映APPMVC型別
- GO語言————8.6 將 map 的鍵值對調Go
- ThunderBird對只有回覆地址的郵件過濾
- Dozer物件對映框架Map到JSONString對映問題排查物件框架JSON
- 如何將資料庫中json格式的列值對映到java物件的屬性中資料庫JSONJava物件
- .Net MVC中定義全域性過濾器及在Action中排除全域性過濾器MVC過濾器
- oracle時間欄位預設值,hibernate對映Oracle
- Generic:型別和值之間的對映 (轉)型別
- AutoMapper在MVC中的運用04-string對映各種型別、一個屬性對映多個屬性等APPMVC型別
- 使用Java Stream,提取集合中的某一列/按條件過濾集合/求和/最大值/最小值/平均值Java
- Nginx埠對映配置Nginx
- 設定InfoObject的過濾值Object
- 面試題:對NotNull欄位插入Null值 有啥現象?面試題Null
- 【NULLS】Oracle對SQL排序後NULL值位置的“特殊關照”NullOracleSQL排序
- .NET CORE 中使用AutoMapper進行物件對映APP物件