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;
}
}
我一直在尝试实现通用存储库,我发现 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;
}
}