Entity Framework 核心无法从泛型推断类型

Entity Framework Core can't infer type from generic

我一直在尝试实现通用存储库,我发现 Entity Framework Core 无法从泛型推断类型,我想我可能被迫对类型化实体执行扩展方法,这是不可能的吗在 Join with Linq 上使用泛型?

public  async Task<IEnumerable<V>> Join<V, T, VID, TID>(this EntityRepository<T> repositoryEntity,
        Func<T, TID> joinIdEntity, Func<V, VID> joinIdEntity1,Func<V, T, V> join)
            where T : class, new()
            where V : class, new()
    {
        Db.Set<T>()
          .Join(Db.Set<V>(), joinIdEntity, joinIdEntity1, join);
    }

您可以在模型中使用虚拟道具,这样您就不必使用 join 如果您使用注释正确设置模型,EF Core 将为您提供一切

问题出在 VID 和 TID 通用参数上。根据 Join 方法签名,连接密钥必须属于同一类型。由于 joinIdEntity 是 Func<T,TID> joinIdEntity 类型,而 JoinIdEntity1 是 Func<V, VID> 类型,因此无法进行连接。唯一的解决办法是声明方法如下:

public  async Task<IEnumerable<V>> Join<V, T,VID>(this EntityRepository<T> repositoryEntity,Expression<Func<T,VID>> joinIdEntity, Expression<Func<V, VID>> joinIdEntity1,Func<V,T,V> join)
        where T : class, new()
        where V : class, new()
    {

        return Db.Set<T>().Join(Db.Set<V>(), joinIdEntity, joinIdEntity1, (e,v) => v);
    }

我认为它与 class 上的 T 实体泛型冲突,因此正确的写法是

 public async Task<ICollection<TResult>> Join<VEntity, TKey, TResult>(Expression<Func<T, TKey>> outerKeySelector, Expression<Func<VEntity, TKey>> innerKeySelector, Expression<Func<T, VEntity, TResult>> resultSelector) 

        where VEntity : class ,new()
        where TResult : class,new()
    {
        try
        {
            return await Db.Set<T>().Join(Db.Set<VEntity>(), outerKeySelector, innerKeySelector, resultSelector).ToListAsync(); ;

        }
        catch (Exception ex)
        {
            return null;
        }
    }