我使用EF和EF Core已有很长时间了,但总有一种或多种方式给我带来问题,那就是在查询中使用方法,特别是在映射时。
例如,现在我有此代码
public IEnumerable<SelectObjDTO> SelectSearch()
{
return Context.Usuarios.IncludePerson().ToSelectObjDTO();
}
并且在不同的班级
public static IQueryable<Users> IncludePerson(this IQueryable<Usuers> Query)
{
return Query.Include(x => x.Persons );
}
public static SelectObjDTO ToSelectObjDTO(this Persons POCO)
{
return new SelectObjDTO()
{
Id = POCO.Users.FirstOrDefault().Id,
FirstName= POCO.DocumentNumber+ " - " + POCO.FirstName + " " + POCO.LastName
};
}
public static IEnumerable<SelectObjDTO> ToSelectObjDTO(this IEnumerable<Persons> Query)
{
return Query.Select(POCO => POCO.ToSelectObjDTO());
}
函数IEnumerable<SelectObjDTO> ToSelectObjDTO(this IEnumerable<Persons> Query)
返回一个错误,因为Users
为空。
但是在IEnumerable<SelectObjDTO> ToSelectObjDTO(this IEnumerable<Persons> Query)
中,查询的内容确实在Users
列表内。
是这种情况,但是在遇到其他问题之前,例如EF Core出现错误,该错误基本上表示上下文在同一查询中运行了两次(非常抱歉,我无法完全记得的方式),通过包含任何要调用的导航属性来解决。
以防万一,我正在使用延迟加载代理。
谢谢
答案 0 :(得分:1)
ToSelectObjDTO
是已编译的函数。您需要传递Expression<Func<...>>
作为Select()
的参数。如果需要,您仍然可以将其编译为其他用途。
public static Expression<Func<Persons,SelectObjDTO>> SelectorFunc { get; } = POCO =>
new SelectObjDTO()
{
Id = POCO.Users.FirstOrDefault().Id,
FirstName= POCO.DocumentNumber+ " - " + POCO.FirstName + " " + POCO.LastName
};
public static Func<Persons,SelectObjDTO> Selector { get; } = SelectorFunc.Compile();
public static IQueryable<SelectObjDTO> ToSelectObjDTO(this IQueryable<Persons> Query)
=> Query.Select(SelectorFunc);