AutoMapper v6.1.1を使用して投影を使用してクラスをマップしようとしていますが、AutoMapperには深くネストされたオブジェクトは含まれていません。Automapper投影には深くネストされた階層オブジェクトが含まれていません
私はここでユニットテストとの完全なのVisual Studio 2015ソリューション添付しました:「AREN https://www.dropbox.com/s/omue5ou5dvxsa57/UnitTestProject2.zip?dl=0
私は基本的にPerson
階層に
Child
と
Parent
階層をマップしようとしている
が、grand- Parents
を投影結果に含めること。
モデル:
public class Child
{
public string Name { get; set; }
public virtual Parent Parent { get; set; }
}
public class Parent
{
public string Name { get; set; }
public virtual Parent GrandParent { get; set; }
}
public class Person
{
public string Name { get; set; }
public virtual Person Parent { get; set; }
}
マッピングプロファイル:
public class PersonProfile : Profile
{
public PersonProfile()
{
this.CreateMap<Child, Person>()
.MaxDepth(5);
this.CreateMap<Parent, Person>()
.ForMember(destinationMember => destinationMember.Parent, memberOptions => memberOptions.MapFrom(sourceMember => sourceMember.GrandParent))
.MaxDepth(5);
}
}
ユニットテスト:
Map
メソッドの作品を使用して
[TestClass]
public class UnitTest1
{
IMapper mapper;
List<Child> children;
[TestInitialize]
public void TestInitialize()
{
MapperConfiguration configuration = new MapperConfiguration((config =>
{
config.AddProfile(new PersonProfile());
config.ForAllMaps((mapType, mapperExpression) =>
{
mapperExpression.MaxDepth(5);
});
}));
this.mapper = configuration.CreateMapper();
mapper.ConfigurationProvider.AssertConfigurationIsValid();
this.children = new List<Child>
{
new Child
{
Name = "Child1",
Parent = new Parent
{
Name = "Parent1",
GrandParent = new Parent
{
Name = "GrandParent1",
GrandParent = new Parent
{
Name = "GreatGrandParent1"
}
}
}
}
};
}
[TestMethod]
public void TestProjection()
{
IQueryable<Person> people = children.AsQueryable().ProjectTo<Person>(mapper.ConfigurationProvider);
AssertPeople(people);
}
[TestMethod]
public void TestMap()
{
List<Person> people = mapper.Map<List<Child>, List<Person>>(children);
AssertPeople(people.AsQueryable());
}
private void AssertPeople(IQueryable<Person> people)
{
Assert.IsNotNull(people);
Assert.AreEqual(1, people.Count());
Person child1 = people.ElementAt(0);
Assert.AreEqual("Child1", child1.Name);
Person parent1 = child1.Parent;
Assert.IsNotNull(parent1);
Assert.AreEqual("Parent1", parent1.Name);
Person grandParent1 = parent1.Parent;
Assert.IsNotNull(grandParent1); // fails when using ProjectTo
Assert.AreEqual("GrandParent1", grandParent1.Name);
}
}
しかしProjectTo
ません。
サンプルコードのクラスは、プロダクションで使用されるクラスよりはるかに簡単です。
ODataからIQueryable<Person>
を返信し、によって生成されたSQL
を利用できるように、プロジェクションを使用しようとしています。クエリオプションが自動的に適用されます。
何か助けていただければ幸いです。
ありがとうございました!
私はそれが午前問題だとは思わない。現在のところ、(再帰ラムダ代理人ではなく)再帰式を定義して翻訳する方法はありません。 –