[英]Querying and mapping complex objects using Linq-to-SQL
我有以下兩個表:
ChildTable
ID ManyColumns ParentID
1 XXXX 1
2 YYYY 1
3 ZZZZ 4
ParentTable
ID Name
1 aaaa
2 bbbb
3 cccc
4 dddd
我有以下代表上述各表的類:
public class Child
{
public string ID { get; set; }
public string ManyColumns { get; set; }
public string ParentID { get; set; }
}
public class Parent
{
public string ID { get; set; }
public string Name { get; set; }
}
但是對於數據傳輸,我有各自的類:
public class ChildDTO
{
public string ID { get; set; }
public string ManyColumns { get; set; }
public ParentDTO Parent { get; set; } //Here is the only IMPORTANT difference
}
public class ParentDTO
{
public string ID { get; set; }
public string Name { get; set; }
}
如何通過以下方式使用LINQ-to-SQL來解決Child to ChildDTO的問題:
我知道我可以使用此選項:
List<ChildDTO> ChildDTOs = (from C in context.Childs
join P in context.Parents on C.ParentId equals P.Id
select new ChildDTO(){
ID = C.ID,
ManyColumns = C.ManyColumns,
Parent = P});
但是,我試圖避免在Select語句上必須執行的多個映射。 同樣,在當前的Beta階段,孩子班級也在不斷變化。 因此,如果使用上述選項,則必須不斷更新這些映射。
為了簡化編碼,我以這種方式使用AutoMapper
AutoMapper.Mapper.CreateMap<Child, ChildDTO>()
.ForMember(dst => dst.Parent, opt => opt.ResolveUsing<Resolver_ParentId_to_Parent>().FromMember(src => src.ParentId))
public class Resolver_ParentId_to_Parent : ValueResolver<string, ChildDTO>
{
protected override ChildDTO ResolveCore(string source)
{
return (from P in context.Parents
Where P.Id = source.ToString()
select item).FirstOrDefault();
}
}
然后,我可以簡單地將其映射:
List<Child> Childs = (from C in context.Childs select C);
List<ChildDTO> newChildDTOs = AutoMapper.Mapper.Map<List<ChildDTO>>(Childs);
這很好,因為:
不足之處:
你們怎么想? 有沒有一種神奇的方法可以解決“兒童到兒童” DTO的問題, 而無需手動映射, 無需錘擊SQL,只需一次即可完成 ? 只是在做夢:
List<ChildDTO> ChildDTOs = (from C in context.Childs
join P in context.Parents on C.ParentId equals P.Id
select SuperConversor(new ChildDTO())).ToList;
我會使用帶有修改的自動映射器的方法。 將父級成員添加到您的子級中。 然后,您可以直接在查詢中加載它( Loading Related Entities ),這樣就可以在Child實例中使用它,而無需使用automapper解析器,也無需對單個子項進行多個查詢。
另外,您可以考慮其他映射器。 我們發現使用automapper的速度快了約10倍,因此從使用automapper切換到了emitmapper。 但這需要進行一些測試,我們使復雜的類下降了幾個層次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.