我编写了一个简化为以下内容的 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 次在同一个“源”上。
(注意:执行查询并调用 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 的两次调用。
在我看来,这是错误,但我可能会遗漏一些东西。这是预期的行为吗?