簡體   English   中英

使用Linq-to-SQL查詢和映射復雜對象

[英]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);

這很好,因為:

  • 快速
  • 清潔
  • 最少的代碼工作量...即使在更改子表時也可以通過添加或刪除列來實現。 只要Class Child和Table Child具有最新的屬性/列名,您總是很高興。 AutoMapper可以解決問題。

不足之處:

  • 我為每個新的ChildDTO錘擊SQL並使用倍數“ ResolveCore”。

你們怎么想? 有沒有一種神奇的方法可以解決“兒童到兒童” 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM