我有以下型号:
public class A_DTO
{
[Key]
public string Id { get; set; }
**public virtual B_DTO B { get; set; }**
public virtual List<B_DTO> Bs { get; set; }
}
public class B_DTO
{
[Key]
public string Id { get; set; }
public string AId { get; set; }
public string UserId {get; set; }
[ForeignKey("AId"]
public virtual A_DTO A { get; set; }
[ForeignKey("UserId"]
public virtual User User { get; set; }
}
我正在尝试获取对象A_DTO的列表,但也包括属性B:
using AutoMapper.QueryableExtensions;
public IQueryable<A_DTO> GetAllA_DTO()
{
string userId = "8b6e9332-7c40-432e-ae95-0ac052904752";
return context.A_DTO
.Include("Bs")
.Include("B")
.Project().To<A_DTO>()
.Where(a => a.Bs.Any(b => b.UserId == userId));
}
如何根据set UserId和A_DTO.Id?
动态设置此属性答案 0 :(得分:1)
以下是一系列观察,您可能很幸运地找到了解决方案:
代码优先模型中的B
属性将导致A_DTO数据库表中存在外键,其中包含对B_DTO表的引用。实体框架将负责使用填充了B_DTO表中引用行的数据的对象填充B
导航属性,因此您将无法动态更改它。
如果源类型和目标类型相同,则无需使用Automapper Project
方法。在您的示例中,它们似乎都是A_DTO
。你确定你实际上并不打算拥有一个实体&#34; A&#34;包含在上下文和&#34; A_DTO&#34;从&#34; A&#34;映射通过Automapper?如果这是您真正想要的,那么您可以在.Select
调用映射A.Bs.FirstOrDefault(b => b.UserId == userId)
到A_DTO.B
中使用代码。但是,您无法根据自动映射地图中的userId
应用过滤。
在没有看到任何Automapper Map设置代码的情况下,很难在这里了解意图。
顺便说一句,在使用.Include
时,在我看来,最好使用带表达式的重载。在您的情况下,包含将被重写:
.Include(a => a.B)
.Include(a => a.Bs)
使用此重载可确保在重命名属性但未能更新.Include
语句中的字符串时会出现编译时错误。