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

NHibernate-如何有条件地从列加载数据,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我们没有使用Fluent Nhibernate。我们有一个带有blob列的表,我们希望有条件地加载它。我们已经将其指定为“lazy”,并且lazy加载工作正常。有没有办法在特定条件下根本不加载该列的数据?(因此适用于相应类别的财产) 例如,下面是映射 <?xml version="1.0" encoding="utf-8"?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Blah.blah.

我们没有使用Fluent Nhibernate。我们有一个带有blob列的表,我们希望有条件地加载它。我们已经将其指定为“lazy”,并且lazy加载工作正常。有没有办法在特定条件下根本不加载该列的数据?(因此适用于相应类别的财产)

例如,下面是映射

<?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 ;
}
私有IList获取文档(IList docId,bool laodData)
{
如果(!laodData)
{
docs=(来自会话中的doc.Query()
其中docId.Contains(doc.docnum)
选择doc.ToList();
}
其他的
{
//如果laodData为false,则不要加载列文档\u数据
}
退货单据;
}

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

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();

}
if(!laodData)
{
docs=(来自会话中的doc.Query()
其中docId.Contains(doc.docnum)
选择文档//完成对象
).ToList();
}
其他的
{
docs=(来自会话中的doc.Query()
其中docId.Contains(doc.docnum)
在NHibernate world中选择new MyDocument//
{//那就叫做
docname=doc.docname,//投影
details=doc.details,
//大型文档无“文档数据”
Id=文件Id,
}
).ToList();
}

通过这些预测,NHibernate内置了强大的
结果转换器
,甚至可以填充受保护的属性。关于
QueryOver
projections的深层(包括关系)转换,请参见…

条件是什么?我真的不明白——如果数据是延迟加载的,那么除非您需要,否则它不会加载。如果您需要它,为什么不加载它?没有意义。@cbp添加了一个示例来更好地说明。您的代码仍然很混乱,但是如果您的doc_数据属性是延迟加载的,并且假设延迟加载正在工作,那么在您访问doc_数据属性之前,不应该加载它。@cbp,正如我在问题中提到的那样“有没有办法在特定条件下根本不加载该列的数据?”…根本不加载该列的数据是我们的要求。这个答案可能有一个设计答案,但我特别寻找解决它的技术可能性。@lame_coder:只是在“特定条件”下不访问它“它将不会加载。限制可能受id列保护。。。但是这个概念应该是有效的。。。享受NHibernate。。。很棒的工具;)PS:查询版本在NHibenrate中实现得更好。。。所以也许至少要检查一下;)