2

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回の呼び出しになります。

私にはバグのように見えますが、何かが足りない可能性があります。これは予想される動作ですか?

4

0 に答える 0