次のコードでGetを呼び出すと、正常に機能します。
public class ContractService : IContractService
{
private readonly IRepository<Contract> repository;
public ContractService(IRepository<Contract> repository)
{
this.repository = repository;
}
public Contract Get(int contractId)
{
return repository.Query().Where(x => x.Id == contractId).FirstOrDefault();
}
しかし、私がこれを行うとき:
public class ContractService : CRUDService<Contract>, IContractService
{
public ContractService(IRepository<Contract> repository) : base(repository)
{
}
}
public class CRUDService<TEntity> : ICRUDService<TEntity> where TEntity : IEntity
{
protected readonly IRepository<TEntity> repository;
public CRUDService(IRepository<TEntity> repository)
{
this.repository = repository;
}
public TEntity Get(int id)
{
var entities = this.repository.Query().Where(s => s.Id == id);
return entities.FirstOrDefault();
}
getメソッド内の「エンティティ」は、反復すると例外をスローします。
Invalid cast from 'System.Int32' to 'TEntity' (where TEntity is the type name)
誰もがなぜ何か考えを持っていますか?
編集:さまざまな式は次のようになります。
ジェネリックバージョン(一番上のバージョン)では、何らかの理由でxを変換しようとしているようです。これはジェネリック:sが原因である必要があります。
{value(NHibernate.Linq.Query`1[Contract]).Where(x => (Convert(x).Id = value(CRUDService`1+<>c__DisplayClass0[Contract]).Id)).FirstOrDefault()}
{value(NHibernate.Linq.Query`1[Contract]).Where(x => (x.Id = value(ContractService+<>c__DisplayClass2).Id)).FirstOrDefault()}
(わかりやすくするために名前空間は省略されています)
2番目の編集:IEntityとインスタンスタイプ(TEntity)の間で変換しようとしたときのようです
これがIEntityです:
public interface IEntity
{
int Id { get; }
}
3番目の編集:AssociationVisitorが式ツリーに適切にアクセスして「Convert(x).Id」を変換しない原因はConvert(x)のようです。
4番目の編集:そして、誰かがすでにバグhttps://nhibernate.jira.com/browse/NHLQ-11を見つけました!
ありがとう
アンドリュー