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 次在同一个“源”上。

(注意:执行查询并调用 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 的两次调用。

在我看来,这是错误,但我可能会遗漏一些东西。这是预期的行为吗?

4

0 回答 0