QueryableBase ve INhQueryProvider etrafında sarıcı oluşturmaya çalışıyorum; bu da yapıcıda bir koleksiyon alacak ve veritabanına gitmek yerine bellekte sorgulayacaktır. Bu yüzden NHibernate'in ToFuture()
davranışını alay edebilmem ve sınıflarımı düzgün bir şekilde test edebiliyorum. Sorun şu ki, sonsuz yineleme nedeniyle yığın taşmasıyla karşı karşıya olduğum ve sebebini bulmaya çalışıyorum.Bellek içi sorguyla özel bir QueryProvider uygulaması
public class NHibernateQueryableProxy<T> : QueryableBase<T>, IOrderedQueryable<T>
{
public NHibernateQueryableProxy(IQueryable<T> data) : base(new NhQueryProviderProxy<T>(data))
{
}
public NHibernateQueryableProxy(IQueryParser queryParser, IQueryExecutor executor) : base(queryParser, executor)
{
}
public NHibernateQueryableProxy(IQueryProvider provider) : base(provider)
{
}
public NHibernateQueryableProxy(IQueryProvider provider, Expression expression) : base(provider, expression)
{
}
public new IEnumerator<T> GetEnumerator()
{
return Provider.Execute<IEnumerable<T>>(Expression).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
internal class NhQueryProviderProxy<T> : INhQueryProvider
{
private readonly IQueryProvider provider;
public NhQueryProviderProxy(IQueryable<T> data)
{
provider = data.AsQueryable().Provider;
}
public IQueryable CreateQuery(Expression expression)
{
return new NHibernateQueryableProxy<T>(this, expression);
}
public IQueryable<TElement> CreateQuery<TElement>(Expression expression)
{
return new NHibernateQueryableProxy<TElement>(this, expression);
}
public object Execute(Expression expression)
{
return provider.Execute(expression);
}
public TResult Execute<TResult>(Expression expression)
{
return provider.Execute<TResult>(expression);
}
public object ExecuteFuture(Expression expression)
{
return provider.Execute(expression);
}
public void SetResultTransformerAndAdditionalCriteria(IQuery query, NhLinqExpression nhExpression, IDictionary<string, Tuple<object, IType>> parameters)
{
throw new NotImplementedException();
}
}
Düzenleme:: ben tür sorunu anladım
İşte benim uygulaması var. expression
için yapılan argümanlardan biri, benim özel sipariş vermem. Bu ifade sağlayıcı tarafından yürütüldüğünde, CreateQuery
ve Execute
arasında sonsuz bir çağrı döngüsüne neden olur. Bu referansa göre sarf edilenler için tüm referanslarımı rücu edilebilir şekilde değiştirebilirmiyim?
Bunu hiç anladın mı? –
Hayır, sonunda, üretim kodunda NH'nin “ToFuture” ve test kodunda “ToList” olarak adlandırılan kendi “ToFuture” ı yarattım. Ama benim tahminim, parametreleri el ile değiştirmek için bir ifade ziyaretçisi yazmanız gerektiğidir. Bu benim bir sonraki denememdi. –
@CallumBradbury hala ihtiyacınız varsa, bence alay etmeyi başardım. Cevabı kontrol et. –