如何以引用的 id 作为标准进行 NHibernate 查询?

Ale*_*shi 2 .net c# nhibernate

我正在尝试通过 NHibernate 进行查询,其中结果的标准取决于引用表的 ID。我该怎么做呢?让我们看一个简单的例子:

public class Foo
{ 
    public int Id { get; set; }
    public string Name { get; set; }
    public Bar ReferencedBar { get; set; }
}    

public class Bar
{ 
    public int Id { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后将 Foo 映射到 Bar:

public class FooMapping : ClassMap<Foo>
{
    public FooMapping()
    {
        Id(c => c.Id).GeneratedBy.HiLo("1");
        Map(c => c.Name).Not.Nullable().Length(100);
        References(c => c.Bar);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想从数据库中获取所有通过 id 引用特定 Bar 的 Foo。此函数使用 Criteria,但如果您觉得使用其他东西更好,请举例说明:

public IList<Foo> GetAllFoosReferencingBar(int barId)
{
    using (var tx = Session.BeginTransaction())
    {
        var result = Session.CreateCriteria(typeof(Foo))
            .Add(Restrictions./* foo.ReferencedBar == id */) // <-- How to add restriction using id? 
            .List<Foo>();
        tx.Commit();
        return result; 
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时,出现异常:

.Add( Restrictions.Eq( "ReferencedBar", 32 ) );
Run Code Online (Sandbox Code Playgroud)

NHibernate.Criterion.SimpleExpression 中的类型不匹配:ReferencedBar 预期类型 Bar,实际类型 System.Int32

我还没有 ID 为 32 的 Bar 的引用对象,并且不想创建一个...

Jos*_*gle 5

如果 Bar 是可延迟加载的(默认情况下是这样),那么您可以“加载”带有 Id 的 Bar 代理。您可以在条件中将该代理实例作为对 Bar 的引用传递:

 var result = Session.CreateCriteria(typeof(Foo))
     .Add(Expression.Eq("ReferenceBar", Session.Load<Bar>(barId)))
     .List<Foo>();
Run Code Online (Sandbox Code Playgroud)

这将产生您期望的 SQL 查询,而无需加入 Bar。