2017-07-30 46 views
0

低於該查詢返回4行,相應的ADRES信息,以便有一個「adresType」列代表的是homeAddress,WorkAdress等 這是AllAddressViewModel所有行:如何通過LINQ查詢構建嵌套視圖模型

public class AllAddressViewModel 
    { 
     public AddressModel homeAddress{ get; set; } 
     public AddressModel workAddress { get; set; } 
    } 

    public class AddressModel 
    { 
     public adresTypeEnum adresType{ get; set; } 
     ... 

這是我正在嘗試;

var result = (  from Muayene in muayeneRepo 
          join Adres in adresRepo on Muayene.HastaTc equals Adres.HastaTc 
          where Muayene.HastaTc == hastaTc.ToString() && Muayene.IsDeleted != true 
          select new HastaMuayeneKayitViewModel() 
          { 
           homeAddress= new AddressModel { 
            adresType= Adres.AddressType, 
            ... 
           }, 
           workAddress = new AddressModel 
           { 
            adresType= Adres.AdresTipi, 
            ... 

我覺得你已經明白了什麼困擾我,我應該配合相應的視圖模型的所有adresType我..如何正確地填充模型LINQ中,不想又邁進了一步。

回答

1

類似於Muayene/w 4地址的連接將導致同一父記錄有4條記錄,每條記錄都有一個地址。

如果地址記錄有區分字段(地址類型),那麼第一步可能是向您的域模型引入繼承,以便Muayene包含地址集合,但該集合將包含0-1(或更多)作爲從Address繼承的不同實體類型。通過這種方式,您可能會更輕鬆地將這些轉換爲相應的視圖模型。 (見表每一個分層繼承。https://msdn.microsoft.com/en-us/data/jj618292

爲構建視圖模型結構,你會想組由Muayene,讓你得到每個父組和其子的地址或更好的收集,利用導航屬性來處理這個。

很難從您的代碼示例中知道,但如果muayeneRepo和addressRepo是基於數據庫表返回IEnumerable之類的存儲庫,這將是性能潛在的問題。通常情況下,你會從DBSets中獲取這些信息。您還應該利用您的域中的導航屬性,以便Muayene實體擁有地址ICollection。

使用基於上下文的例子:

var muayenes = _context.Muayenes.Include(x => x.Addresses) 
.Where(x => x.HastAc == hastAc && false == x.IsDeleted) 
.ToList(); // Materializes these entities so further operations are Linq2Object 

如果沒有導航性能和想加入的DbSets,那麼你可以通過加入實體,然後做的GroupBy所在組完成相同鍵是父實體,分組值是地址。

我通常會使用的下一步是添加一個構造函數或工廠類來處理從我的實體中填充視圖模型的新實例,或者連接類似AutoMapper的東西來執行此操作。通常情況下,我只是自己將其連接起來,因爲它通常比查找別處的映射規則更容易,試圖找出爲什麼發生了變化。

例如:(構造)

var viewModels = muayenes.Select(x => new HastaMuayeneKayitViewModel(x)).ToList(); 

或(工廠)

var viewModels = muayens.Select(x => HastaMuayeneKayitViewModelFactory.Create(x)).ToList(); 

地址可以使用相同的原則來構建。

填充視圖模型和子視圖模型的邏輯可以移動到支持代碼並重新使用,而不是以一個大的Linq表達式結束。

+0

感謝您的詳細解答和解答。 – TyForHelpDude