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 的引用对象,并且不想创建一个...
如果 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。