我编写了一个简化为以下内容的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条记录。但是,“变换(源)”被称为3次,其中2次在同一“源”上。
(注意:在执行查询并调用ToList()之后,列表包含2条记录。似乎NHibernate LINQ忽略了Select返回的非唯一对象)。
仅当查询具有Fetch时才会发生此行为,例如:
var groups = repository.Get()
.FetchMany(x => x.Members)
.Where(...)
.SelectWithoutProxies()
.ToList<ContactGroup>();
将导致groups.Count == 2和三次调用Transform。
然而:
var groups = repository.Get()
.Where(...)
.SelectWithoutProxies()
.ToList<ContactGroup>();
将导致groups.Count == 2和两次调用Transform。
在我看来这是一个错误,但我可能会遗漏一些东西。这是预期的行为吗?