C# 三级表的NHibernate Linq where子句

C# 三级表的NHibernate Linq where子句,c#,linq,nhibernate,C#,Linq,Nhibernate,我有三个表,组->用户->帐户。 组可以有多个用户,用户可以有多个帐户 当我尝试使用query获取组中的所有帐户时 var accounts = accountRepository.FindAll(x => x.User.Group.Id == groupId); 其中FindAll是公共存储库中的方法 /// <summary> /// Find all entities with filter /// </summary> /// <param name

我有三个表,组->用户->帐户。 组可以有多个用户,用户可以有多个帐户

当我尝试使用query获取组中的所有帐户时

var accounts = accountRepository.FindAll(x => x.User.Group.Id == groupId);
其中FindAll是公共存储库中的方法

/// <summary>
/// Find all entities with filter
/// </summary>
/// <param name="expression">Linq expression</param>
/// <returns>IQueryOver of entity of type TEntity</returns>
public IQueryOver<TEntity> FindAll(Expression<Func<TEntity, bool>> expression)
{
    var query = _session.QueryOver<TEntity>();
    query.Cacheable().CacheMode(CacheMode.Normal);
    return query.Where(expression);
}

中编写此查询的更好方法是使用Linq to NHibernate:

public IQueryable<TEntity> FindAll(Expression<Func<TEntity, bool>> expression)
{
    var query = _session.Query<TEntity>();
    return query.Where(expression);
}
public IQueryable FindAll(表达式)
{
var query=_session.query();
返回query.Where(表达式);
}

QueryOver
不同,Linq提供程序支持此类查询(遍历实体层次结构),将其转换为SQL联接。

使用Linq来代替NHibernate:

public IQueryable<TEntity> FindAll(Expression<Func<TEntity, bool>> expression)
{
    var query = _session.Query<TEntity>();
    return query.Where(expression);
}
public IQueryable FindAll(表达式)
{
var query=_session.query();
返回query.Where(表达式);
}

QueryOver
不同,Linq提供程序支持此类查询(遍历实体层次结构),将其转换为SQL联接。

这对我很有用-->var accounts=(来自会话中的用户.QueryOver(),其中user.Group.Id==groupId选择user.accounts).List();这是因为
user.Group.Id
是为
user
实体自动获取的值-它是其表中的外键。但要测试例如
account.User.Group.Id
(就像您在原始问题中所做的那样),NHibernate必须在SQL中生成一个连接,从
account
User
,然后再到
Group
。不同之处在于,虽然
QueryOver
不适合您,但
Query
(Linq到NHibernate)适合您。这对我很好-->var accounts=(来自会话中的用户.QueryOver(),其中user.Group.Id==groupId选择用户.accounts)。List();这是因为
user.Group.Id
是为
user
实体自动获取的值-它是其表中的外键。但要测试例如
account.User.Group.Id
(就像您在原始问题中所做的那样),NHibernate必须在SQL中生成一个连接,从
account
User
,然后再到
Group
。不同之处在于,
QueryOver
不能为您执行此操作,
Query
(Linq to NHibernate)可以执行此操作。@Avi,您正在尝试使用QueryOver,插入Linq@Avi,您正在尝试使用QueryOver,Linq的insetad