NHibernate 3基于字符串的获取路径?

NHibernate 3基于字符串的获取路径?,nhibernate,eager-loading,Nhibernate,Eager Loading,我正在尝试用NHibernate实现实现DAO接口。该接口调用要公开的类似于Fetch的方法,其签名如下: IQueryable<TEntity> AllIncluding(params string[] properties); IQueryable AllIncluding(参数字符串[]属性); EntityFramework等价的实现很容易,因为它们有一个Include(string prop)扩展方法,但我在QueryOver或NHIbernate LINQ中都没有看到

我正在尝试用NHibernate实现实现DAO接口。该接口调用要公开的类似于Fetch的方法,其签名如下:

IQueryable<TEntity> AllIncluding(params string[] properties);
IQueryable AllIncluding(参数字符串[]属性);
EntityFramework等价的实现很容易,因为它们有一个Include(string prop)扩展方法,但我在QueryOver或NHIbernate LINQ中都没有看到类似的东西;只是获取Func的Fetch方法。有没有办法解决这个问题


谢谢你试过类似的东西吗

session.QueryOver<Product>()
    .UnderlyingCriteria.SetFetchMode("PropertyName", FetchMode.Eager);
session.QueryOver()
.underlineCriteria.SetFetchMode(“PropertyName”,FetchMode.Eager);
据我所知,QueryOver只是对Criteria的包装,Criteria还有一个非类型/基于字符串的设置获取模式版本

更新

因此,您的方法可以如下所示:

public IQueryOver<TEntity, TEntity> AllIncluding(params string[] properties)
{
    var queryOver = session.QueryOver<TEntity>();
    var criteria = queryOver.UnderlyingCriteria;

    foreach (var property in properties)
    {
        criteria.SetFetchMode(property, FetchMode.Eager);
    }

    return queryOver;
}
public IQueryOver AllIncluding(参数字符串[]属性)
{
var queryOver=session.queryOver();
var标准=查询版本。参考标准;
foreach(属性中的var属性)
{
criteria.SetFetchMode(属性,FetchMode.Eager);
}
返回查询器;
}

您尝试过类似的方法吗

session.QueryOver<Product>()
    .UnderlyingCriteria.SetFetchMode("PropertyName", FetchMode.Eager);
session.QueryOver()
.underlineCriteria.SetFetchMode(“PropertyName”,FetchMode.Eager);
据我所知,QueryOver只是对Criteria的包装,Criteria还有一个非类型/基于字符串的设置获取模式版本

更新

因此,您的方法可以如下所示:

public IQueryOver<TEntity, TEntity> AllIncluding(params string[] properties)
{
    var queryOver = session.QueryOver<TEntity>();
    var criteria = queryOver.UnderlyingCriteria;

    foreach (var property in properties)
    {
        criteria.SetFetchMode(property, FetchMode.Eager);
    }

    return queryOver;
}
public IQueryOver AllIncluding(参数字符串[]属性)
{
var queryOver=session.queryOver();
var标准=查询版本。参考标准;
foreach(属性中的var属性)
{
criteria.SetFetchMode(属性,FetchMode.Eager);
}
返回查询器;
}

为了方便起见,我将发布Meligy解决方案中提供的方法的扩展版本

public static class QueryOverExtensions
{        
    public static IQueryOver<T, T> AllIncluding<T>(this IQueryOver<T, T> source, params string[] properties)
    {
        var criteria = source.UnderlyingCriteria;
        foreach (var property in properties)
        {
            criteria.SetFetchMode(property, FetchMode.Eager);
        }
        return source;
    }
}
公共静态类QueryOverExtensions
{        
公共静态IQueryOver AllIncluding(此IQueryOver源,参数字符串[]属性)
{
var标准=来源。参考标准;
foreach(属性中的var属性)
{
criteria.SetFetchMode(属性,FetchMode.Eager);
}
返回源;
}
}
现在您可以这样调用该方法:

queryOver.AllIncluding<TEntity>("property").where(...);
queryOver.all包括(“属性”)。其中(…);

为了方便起见,我将发布Meligy解决方案中提供的方法的扩展版本

public static class QueryOverExtensions
{        
    public static IQueryOver<T, T> AllIncluding<T>(this IQueryOver<T, T> source, params string[] properties)
    {
        var criteria = source.UnderlyingCriteria;
        foreach (var property in properties)
        {
            criteria.SetFetchMode(property, FetchMode.Eager);
        }
        return source;
    }
}
公共静态类QueryOverExtensions
{        
公共静态IQueryOver AllIncluding(此IQueryOver源,参数字符串[]属性)
{
var标准=来源。参考标准;
foreach(属性中的var属性)
{
criteria.SetFetchMode(属性,FetchMode.Eager);
}
返回源;
}
}
现在您可以这样调用该方法:

queryOver.AllIncluding<TEntity>("property").where(...);
queryOver.all包括(“属性”)。其中(…);

谢谢,我将尝试这种方法。不过,还有一个后续问题;请注意,我的接口需要IQueryable,而不是IQueryOver。有没有一种方法可以使用您的技术而不必使用ToList()具体化所有数据?理想情况下,IQueryable的语义表明我返回的是可链接的w/延迟执行,如果可能的话,我想保持它;注意,我不认为IQueryable()是由NH处理的(它是任何可枚举的linq ext.方法)。所以,我认为当您对可查询项执行“Where”之类的操作时,它可能是在内存中完成的,而不是在查询中完成的(查询会带来整个列表)。测试它以验证是否发生了这种行为。工作正常,很抱歉没有提前投票给您。谢谢你的帮助。保罗,问过了。以后的工作还是你最终使用IQueryOver?谢谢,我会试试这种方法。不过,还有一个后续问题;请注意,我的接口需要IQueryable,而不是IQueryOver。有没有一种方法可以使用您的技术而不必使用ToList()具体化所有数据?理想情况下,IQueryable的语义表明我返回的是可链接的w/延迟执行,如果可能的话,我想保持它;注意,我不认为IQueryable()是由NH处理的(它是任何可枚举的linq ext.方法)。所以,我认为当您对可查询项执行“Where”之类的操作时,它可能是在内存中完成的,而不是在查询中完成的(查询会带来整个列表)。测试它以验证是否发生了这种行为。工作正常,很抱歉没有提前投票给您。谢谢你的帮助。保罗,你问过了吗?以后的工作还是你最终使用了IQueryOver?