在EF Core查询中使用方法

时间:2019-12-18 17:00:01

标签: c# asp.net .net-core entity-framework-core ef-core-2.2

我使用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出现错误,该错误基本上表示上下文在同一查询中运行了两次(非常抱歉,我无法完全记得的方式),通过包含任何要调用的导航属性来解决。

以防万一,我正在使用延迟加载代理。

谢谢

1 个答案:

答案 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);