Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用NHibernate获取多个深度和广度的对象?_C#_Nhibernate_Nhibernate Mapping_Linq To Nhibernate_Nhibernate Criteria - Fatal编程技术网

C# 如何使用NHibernate获取多个深度和广度的对象?

C# 如何使用NHibernate获取多个深度和广度的对象?,c#,nhibernate,nhibernate-mapping,linq-to-nhibernate,nhibernate-criteria,C#,Nhibernate,Nhibernate Mapping,Linq To Nhibernate,Nhibernate Criteria,我有一个例子,我需要从数据库中加载大约10000个对象。数据模型如下所示: public class SimulationObject { public Container Container {get;set;} public IList<ResultItem> Results {get;set;} public IList<PreviewData> PreviewData {get;set;} ... } public class R

我有一个例子,我需要从数据库中加载大约10000个对象。数据模型如下所示:

public class SimulationObject
{
    public Container Container {get;set;}
    public IList<ResultItem> Results {get;set;}
    public IList<PreviewData> PreviewData {get;set;}
    ...
}

public class ResultItem
{
    public IList<SomeDataItem> Items {get;set;}
    ...
}

public class PreviewData
{
    public IList<SomeDataItem> Items {get;set;}
    ...
}
var query = from sim in session.Query<SimulationObject>()
        where sim.Container.Id == containerId && ...
            select sim;

query = query.FetchMany(c => c.Results).ThenFetch(o => o.Items)...
公共类模拟对象
{
公共容器容器{get;set;}
公共IList结果{get;set;}
公共IList预览数据{get;set;}
...
}
公共类结果
{
公共IList项{get;set;}
...
}
公共类预览数据
{
公共IList项{get;set;}
...
}
这意味着我想根据某个查询从数据库中查询SimulationObject列表,以及它的所有属性(引用)和子项

收集的数量如下所示:

  • SimulationObject-ca 6000-1200,具体取决于“where”中的参数
  • 模拟对象结果-ca 5至40项
  • SimulationObject.Results.Items-ca 0到2项
  • SimulationObject.PreviewData-ca 0到2项
  • SimulationObject.PreviewData.Items-ca 1到3项
  • 通常,我会这样做:

    public class SimulationObject
    {
        public Container Container {get;set;}
        public IList<ResultItem> Results {get;set;}
        public IList<PreviewData> PreviewData {get;set;}
        ...
    }
    
    public class ResultItem
    {
        public IList<SomeDataItem> Items {get;set;}
        ...
    }
    
    public class PreviewData
    {
        public IList<SomeDataItem> Items {get;set;}
        ...
    }
    
    var query = from sim in session.Query<SimulationObject>()
            where sim.Container.Id == containerId && ...
                select sim;
    
    query = query.FetchMany(c => c.Results).ThenFetch(o => o.Items)...
    
    var query=来自会话中的sim卡。query()
    其中sim.Container.Id==containerId&&。。。
    选择sim卡;
    query=query.FetchMany(c=>c.Results)。然后fetch(o=>o.Items)。。。
    
    但是,我还需要获取“PreviewData”项,因为这将在我的查询中创建笛卡尔积(意味着PreviewData和SubItemsCount x ResultsAndSubItemsCount返回的行数),这是非常无效的。另外,由于我需要加载很多SumulationObject(如前所述,大约10000个),所以我不能进行延迟加载(10000个查询..还有其他困难,所以这甚至不是考虑的替代方案)

    那么,还有什么选择呢?您将使用什么策略将complite对象图加载到内存中


    谢谢。

    Ayende在这里解释了一种方法(HQL):

    我还看到一篇StackOverflow文章,它使用QueryOver


    不过,我非常有兴趣从hte社区的其他成员那里获得更多的投入。我认为这是NH可以改进的一个领域。

    10000
    SimulationObject
    s是一个固定的数字,还是未来可能会增长?每个模拟对象平均有多少个
    ResultItem
    s?每个模拟对象有多少个预览数据?每个
    PreviewData
    ResultItem
    有多少个
    SomeDataItem
    s?您是否还需要获取
    SomeDataItem
    s,或者这些子项是否可以延迟加载?在
    SimulationObject
    中,是否
    PreviewData
    ResultItem
    共享它们的
    SomeDataItem
    s?换句话说,给定一个
    SomeDataItem x
    ,以下语句是否正确:
    x.ResultItem.SimulationObject==x.PreviewData.SimulationObject
    ?如果是这样,那么您就有了一个菱形的关系,这会影响我们需要在这些孙对象上执行多少抓取操作。不,它们不共享关系。事实上,PreviewData项和ResultItem项保存在数据库的不同表中。SomeDataItem类是伪代码。。哦,我在帖子中增加了数量。有没有办法用Linq做到这一点。我不太理解这个QueryOver API..至少在某个地方有什么好的解释吗?这并没有说明当你想要结果时如何去做。第二个查询中的内容将按照博客文章中的指定被丢弃。如果你急切地需要孩子们的桌子怎么办。