LINQ拡張メソッドを次のように簡略化して記述しました。
public static class NHibernateSelectWithoutProxies
{
public static IQueryable<T> SelectWithoutProxies<T>(this IQueryable<T> query) where T : new()
{
return query.Select<T, T>(x => Transform<T>(x));
}
private static T Transform<T>(T source) where T : new()
{
return source; // Simplified
}
}
データベースから2つのレコードが選択されています。ただし、「Transform(source)」は3回呼び出され、そのうち2回は同じ「source」上にあります。
(注:クエリが実行され、ToList()が呼び出された後、リストには2つのレコードが含まれます。NHibernateLINQは、Selectによって返された一意でないオブジェクトを無視するようです)。
この動作は、クエリにフェッチがある場合にのみ発生します。次に例を示します。
var groups = repository.Get()
.FetchMany(x => x.Members)
.Where(...)
.SelectWithoutProxies()
.ToList<ContactGroup>();
結果はgroups.Count==2およびTransformへの3回の呼び出しになります。
でも:
var groups = repository.Get()
.Where(...)
.SelectWithoutProxies()
.ToList<ContactGroup>();
結果はgroups.Count==2とTransformへの2回の呼び出しになります。
私にはバグのように見えますが、何かが足りない可能性があります。これは予想される動作ですか?