我正在使用爆米花来允许我的API的客户端指定解开所请求对象的属性的深度。
我在将数据模型实体之一映射到投影时遇到问题。所有实体都是实体框架数据模型,所以我尽可能使用"MapEntityFramework"。
数据模型如下所示:
public class DataModel {
public List<Person> Persons { get; set; }
}
public class Person {
public Guid Id { get; set; }
public List<Pet> Pets {get; set;}
public List<Pet> GetLivingPets() {
// Do some computation to get the pets that are alive
}
}
public class Pet {
public Guid Id { get; set; }
public string Name { get; set; }
public bool Alive { get; set; }
}
public PetProjection {
public Guid? Id { get; set; }
public string Name { get; set; }
}
public PersonProjection {
public Guid? Id { get; set; }
public List<PetProjection> LivingPets {get; set;}
}
我希望我的客户端能够发出指定动态生成列表嵌套的请求的请求。http://localhost:5000/api/1/Persons?include=[Id,活宠物[姓名]]
这将返回如下列表:
[
{
"Id": "00000000-0000-0000-0000-000000000000",
"LivingPets": [
{
"Name": "Capt Meowmix"
}
]
}
]
这是我正在尝试的映射:
popcornConfig
.Map<Person, PersonProjection>(config: (personConfig) =>
{
personConfig.Translate(fp => fp.LivingPets, f => f.GetLivingPets()?.ToList()); // Error: 'Dictionary<string, object>' does not contain a definition for 'GetLivingPets' and no extension method 'GetLivingPets' accepting a first argument of type 'Dictionary<string, object>' could be found (are you missing a using directive or an assembly reference?)
})
.MapEntityFramework<Pet, PetProjection, DataModel>(dbContextOptionsBuilder);
我需要做什么来编写一个将使用我已经定义的另一个映射的映射?这是图书馆可以做的事情吗?我错过了什么吗?
不需要LivingPets
上的Translate
。Popcorn 会自动在映射实体及其投影之间查找相同的命名属性。 它将查找匹配的属性,或者失败不需要参数的匹配方法,因此,如果您将方法命名为LivingPets
它将自动工作。 但是,您使用翻译所做的事情也应该有效。
关于翻译函数,只要它返回一个 Popcorn 有映射的对象,客户端应该能够扩展它。您看到该错误是因为编译器选择了错误的翻译函数版本。如果切换
personConfig.Translate(fp => fp.LivingPets, f => f.GetLivingPets()?.ToList());
自
personConfig.Translate(fp => fp.LivingPets, (f,c) => f.GetLivingPets()));
编译错误应消失。这是一个错误,正在此问题中进行跟踪。