我有我在視圖中使用的域類分離,所以當檢索數據時,我必須將域類映射到視圖類。 直到現在,這已經很簡單了,但現在我有一種情況,我需要將父域子類從域映射到視圖上的父子子類。使用linq來映射父子結構
使用foreach
結構工作正常,但我有很多linq方法做域和視圖類之間的映射,需要重構以適應新的需求,如果我知道如何去做會更快與linq。提前致謝。
至於是什麼,我試圖完成見下面的代碼示例:
在庫中我有類:
public class Parent
{
public int ParentId { get; set; }
public string ParentName { get; set; }
};
public class ChildA : Parent
{
public string ChildPropertyA { get; set; }
};
public class ChildB : Parent
{
public string ChildPropertyB { get; set; }
};
然後在UI我有類:
public class ParentVM
{
public int ParentIdVM { get; set; }
public string ParentNameVM { get; set; }
};
public class ChildAVM : ParentVM
{
public string ChildPropertyAVM { get; set; }
};
public class ChildBVM : ParentVM
{
public string ChildPropertyBVM { get; set; }
};
現在我將有一個服務類,其中的方法將如下所示:
public GetParentVMs()
{
var parents = initializeRepositoryClass();
var parentsVM = MapRepositoryToViewClasses(parents);
ShowResult(parentsVM);
}
其中:
public List<Parent> initializeRepositoryClass()
{
var parents = new List<Parent>(){
new ChildA(){ParentId=1, ParentName="Parent 1", ChildPropertyA="A"},
new Parent(){ParentId=2, ParentName="Parent 2"},
new ChildB(){ParentId=3, ParentName="Parent 3", ChildPropertyB="B"},
};
return parents;
}
private List<ParentVM> MapRepositoryToViewClasses(List<Parent> parents)
{
var parentsVM = new List<ParentVM>();
foreach (var item in parents)
{
if (item is ChildA)
{
var itemVM = item as ChildA;
parentsVM.Add(
new ChildAVM() { ParentIdVM = itemVM.ParentId, ParentNameVM = itemVM.ParentName, ChildPropertyAVM = itemVM.ChildPropertyA }
);
}
else if (item is ChildB)
{
var itemVM = item as ChildB;
parentsVM.Add(
new ChildBVM() { ParentIdVM = itemVM.ParentId, ParentNameVM = itemVM.ParentName, ChildPropertyBVM = itemVM.ChildPropertyB }
);
}
else
{
var itemVM = item as Parent;
parentsVM.Add(
new ParentVM() { ParentIdVM = itemVM.ParentId, ParentNameVM = itemVM.ParentName }
);
}
}
return parentsVM;
}
private void ShowResult(List<ParentVM> parentsVM)
{
foreach (var item in parentsVM)
{
if (item is ChildAVM)
{
var ca = (ChildAVM)item;
Console.WriteLine("Child A " + ca.ChildPropertyAVM);
}
else if (item is ChildBVM)
{
var cb = (ChildBVM)item;
Console.WriteLine("Child B " + cb.ChildPropertyBVM);
}
else
{
Console.WriteLine("Parent ");
}
}
}
上面的代碼將工作,但我想改變的方法MapRepositoryToViewClasses到另一個使用LINQ,和看起來像下面這樣:
private List<ParentVM> MapRepositoryToViewClassesLinq(List<Parent> parents)
{
var parentsVM =
from p in parents
case
p is ChildA then select new ChildAVM() {ChildPropertyAVM = p.ChildPropertyA, ...};
else
p is ChildB then select new ChildBVM() {ChildPropertyBVM = p.ChildPropertyB, ...};
else
select new ParentVM() {ParentIdVM = p.ParentId};
return parentsVM.ToList();
}
任何想法?謝謝。
尼斯的答案,但我有許多方法是使用映射李克:從父母中選擇新的父母VM(){...},我想避免一個大的重構。有沒有辦法將新的parentVM(){}替換爲新的factory.create ??。謝謝 – Juan
我真正在尋找的東西,就像我在方法MapRepositoryToViewClassesLinq中顯示的語法。已經映射到我的項目的類使用類似的語法(沒有繼承),我想知道是否有一些方法可以用linq做到這一點,而無需重寫整個方法。 – Juan
要提供一個不需重構的好解決方案並不那麼容易,我會試着展示另一個。 –