NHibernate - 如何有条件地从列加载数据

时间:2014-07-31 23:54:12

标签: nhibernate nhibernate-mapping

我们没有使用Fluent Nhibernate。我们有一个带有blob列的表,我们希望有条件地加载它。我们已经将它指定为'懒惰'并且延迟加载工作正常。有没有办法在某个条件下不加载根据完成列的数据? (因此属于各自的财产)

例如,这是映射

<?xml version="1.0" encoding="utf-8"?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Blah.blah.blah" assembly="Blah.blah">

  <class name="MyDocument" table="HEAVY_DOCS">
  <id name="Id" column="docnum" type="decimal"> </id>
  <property name="docname" column="docname" />
  <property name="details" column="details" />
  <property name="doc_data" column="document_data" lazy="true"  />

</class>
</hibernate-mapping>

及以下是获取文件的代码

private IList<MyDocument> FetchDocuments(IList<string> docId, bool laodData)
{

if(!laodData)
{
    docs = (from doc in Session.Query<MyDocument>()
               where docId.Contains(doc.docnum)
               select doc).ToList();
}
else
{
 //if laodData is false dont load column document_data 

}
return docs ;
}

1 个答案:

答案 0 :(得分:0)

我们的代码如何驱动列选择的方法是使用projections。调整后的代码可能如下所示:

if(!laodData)
{
    docs = (from doc in Session.Query<MyDocument>()
               where docId.Contains(doc.docnum)
               select doc // complete object
           ).ToList();
}
else
{
    docs = (from doc in Session.Query<MyDocument>()
               where docId.Contains(doc.docnum)
               select new MyDocument            // in NHibernate world
               {                                // that would be called
                 docname= doc.docname,          // projection
                 details = doc.details,
                 // no "doc_data" for LARGE document
                 Id = doc.Id, 
               }
             ).ToList();

}

使用QueryOver,预测可以从强大的Result Transformers内置的NHibernate中获益,它可以填充甚至受保护的属性。也许请参阅this custom transformer example深入(包括关系) QueryOver投影转换...