我一直在嘗試實作一個泛型存盤庫,但我發現 Entity Framework Core 無法從泛型推斷型別,我想我可能會被迫對型別化物體進行擴展方法,難道不能在使用 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);
}
uj5u.com熱心網友回復:
問題是 VID 和 TID 通用引數。根據 Join 方法簽名,join key 必須是相同的型別。由于 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);
}
uj5u.com熱心網友回復:
您可以在模型中使用虛擬道具,因此您不必使用 join 如果您使用注釋正確設定模型,EF Core 將為您提供一切
uj5u.com熱心網友回復:
我相信它與類上的 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;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/458836.html
