抽象类型集合的获取策略

2024-02-21

所以情况是这样的:假设我有一个用于表示灵活搜索的类结构:

public class SearchDefinition
{
    public virtual string Name {get; set;}
    public virtual IEnumerable<SearchTerm> Terms {get; set;}
}

public abstract class SearchTerm
{
    public virtual Operator Op {get; set; } //i.e 'In', 'Not in', 'Contains' etc..
    public abstract IEnumerable<object> CompareValues {get; } //the values against which the search is performed. for example- 'in (2,6,4)', 'contains ('foo', 'blah')'.
}

现在,由于搜索词可以引用不同的字段,因此每种类型的词都有自己的类:

public class NameSearchTerm : SearchTerm
{
   public virtual IEnumberable<string> ConcreteValues {get; set;}
   public override IEnumberable<object> CompareValues 
     {
        get
        {
            return ConcreteValues.Cast<object>();
        }
     }
}

等等,具有不同类型的集合。
术语使用每个层次结构表进行映射,除了ConcreteValues集合,映射到不同的表(字符串值的表,int 值的表等)。

我的问题是 - 我如何有效地检索列表SearchDefinition是?为收集SearchTerm我不能使用select策略(将导致选择 N+1)。
但是,使用获取JoinQueryOver or JoinAlias,在发送正确的查询时,不会填充集合:

var definitions = session.QueryOver<SearchDefinition>()
   .Where(/*condition*/)
   .JoinAlias(d=> d.Terms, () => termsAlias)
   .List();   //sends a correct, joined query which fetches also the terms from the terms table

Assert.IsTrue(NHibernateUtil.IsInitialized(definitions[0].Terms)); //THIS FAILS!

关于如何做到这一点有什么建议吗?
我在这里添加流畅的映射 -

里面的术语集合SearchDefinition班级:

 mapping.HasMany(x => x.Terms)
                //.Not.LazyLoad()
                .Fetch.Subselect()
                .Cascade.AllDeleteOrphan()
                .Cache.ReadWrite();

具体值集合内IntSearchTerm班级(所有学期班级均类似):

mapping.HasMany<int>(t=> t.ConcreteValues).Table("TermsIntValues").Element("IntValue")
                //.Not.LazyLoad()
                .Fetch.Subselect()
                .Cascade.AllDeleteOrphan();

使用时JoinQueryOver or JoinAliasNHibernate 不会初始化该集合,因为您可以过滤掉术语,因此可能不会获取术语集合中的所有术语。我能想到的唯一方法是子查询。

var subquery = QueryOver.For<SearchDefinition>()
   .Where(/*conditions*/)
   .JoinAlias(d=> d.Terms, () => termsAlias)
   .Where(/*Terms.conditions*/)
   .Select(def => def.Id);

var definitions = session.QueryOver<SearchDefinition>()
   .WithSubquery.WhereProperty(def => def.Id).In(subquery);
   .List();

Assert.IsTrue(NHibernateUtil.IsInitialized(definitions[0].Terms));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

抽象类型集合的获取策略 的相关文章

随机推荐

  • 具有多个条件的聚合以及基于计数键的求和匹配

    我试图获取另一个集合中的对象数组中存在的元素的计数 例子 集合A id 1 name Sample1 id 2 name Sample 2 id 3 name Sample 3 id 4 name Sample 4 集合B id 11 it
  • C# 将类的复杂对象序列化为json

    我想将以下类的新对象转换为 json 字符串 为此 我使用 JavaScriptSerializer 和 Newtonsoft 库 但它们的输出都是空括号 using System using System Collections usin
  • 对外部生成的静态内容进行指纹识别(ASP.NET + browserify)

    Nodejs browserify https github com substack browserify handbook introduction在构建模块化 js 应用程序时非常棒 如果gulp也是设置 工作流程的一部分进一步增强
  • JBOSS WEB-INF/lib 内容排序

    我有一个ear 文件 其中包含一个war 文件 war 的 WEB INF lib 目录中包含许多 jar 文件 其中一些 jar 包含相同类的冲突 或至少不同 版本 有没有办法可以影响 JBOSS 将这些 jar 文件添加到类路径的顺序
  • firebase-admin 是否会覆盖 firestore 安全规则?

    如果读 写访问的安全规则设置为需要身份验证 firebase admin 是否能够在没有身份验证的情况下读 写 Firebase Admin SDK 使用服务帐户访问您的数据库 服务帐号会忽略 Cloud Firestore 安全规则 类似
  • Git:添加、推送、提交

    git 和 git 有什么区别add push and commit 只是来自 SVN 的有点困惑 其中 更新 将 添加 内容 而提交则执行 推送 并且也会 添加 git 中有各种不同的功能 希望根据您的经验给出一些解释 git add将修
  • 使用 AutoMapper 动态映射包括数组在内的对象

    我正在尝试构建一种从一种类型映射到另一种类型的方法 因为我知道它们将 应该 具有相同的结构 相关问题 https stackoverflow com questions 2622003 call webservice without add
  • 调用 window.print() 时会触发什么事件?

    我正在努力解决这个问题 但今晚收效甚微 我想如果我只知道当window print 函数被调用 var browser name navigator appName if browser name Microsoft Internet Ex
  • Symfony 表单值缺失

    我正在编写一个简单的登录表单 一切正常 验证等 但我无法获取值 这是我的代码 public function executeIndex sfWebRequest request this gt getUser gt clearCredent
  • 计算时间序列中的运行和/衰减值

    我正在寻找计算时间序列内特定类型的 递减 总和或衰减值 例如 假设我有一些简单的数据 thedata lt data frame magicseeds c 30 20 10 40 20 week seq from 1 to 5 by 1 我
  • Android Kotlin:从目录中获取图像

    我正在使用 Kotlin 前端 Python 后端构建一个应用程序 我的 python 脚本在 getFilesDir 目录 data user 0 com example myproject files mygraph png 下创建一个
  • 如何在 Talend 中动态猜测 Mysqlinput 中的架构

    我已经构建了一个将数据从 mysql db 表复制到 b mysql 表的作业 表列是相同的 只是有时可以在表数据库中添加新列 我想检索从 a 到 b 的所有列 但只检索表 b 中存在的那些列 我能够放入表 b 中存在的查询特定选择列语句
  • 如果我将 extern "C++" 与 C 工具链一起使用会发生什么?

    我的问题主要是关于 C 工具链 理解 C 和 C 的事实 所以如果我用extern C 对于 C 工具链 我认为它可以理解如何处理它 但是如果我用以下代码提供代码怎么办extern C 到 C 工具链 预期的行为是什么 如果编译器也理解 C
  • 使用 Daper.Net 和 NPGSQL 将数据插入 PostgreSQL jsonb 列

    我正在尝试使用 Dapper Net 将 JSON 数据插入到 JSONB PostgreSQL 列中 The JSONB 的 NPGSQL 文档 http www npgsql org doc faq html给出了具体的使用说明Npgs
  • 尝试将隐藏的输入值发送到下一页

    我正在尝试根据客户的需求调整 Wordpress Jigoshop 但遇到了一些困难 我需要的是 当选择产品变体时 一些附加选项以单选按钮的形式出现 客户必须选择 我已经设法让一切正常工作 但我现在需要的是在单击提交按钮时将选定的单选按钮发
  • 是否可以对最小化的应用程序进行屏幕截图

    我知道可以捕获另一个应用程序后面的应用程序的屏幕 但我似乎找不到任何有关捕获最小化应用程序屏幕的信息 有人知道这是否可能吗 我不想很快就涉及最大化和最小化应用程序之类的事情 正如 ziplin 所说 对于较新版本的 Windows 这可能是
  • iPhone/iOS 中 viewDidAppear 和 viewDidLoad 之间的区别? [复制]

    这个问题在这里已经有答案了 最重要的是 我一直在开发一个应用程序 似乎如果我放置一个UIAlert in viewDidLoad 它被调用两次 从委托方法UIImagePickerController 如果我把它放进去viewDidAppe
  • python 中的导入是否被视为动态链接?

    用 posix 和通用技术软件开发的话说 是否有import一个纯粹的python 不是cython或c编译的库 模块构成动态链接 不 加载纯 Python 模块不被视为动态链接的一种形式 传统的动态链接将机器代码加载到新的内存块中 并且可
  • 如何将更改的文件添加到 Git 中较旧的(不是最后一次)提交

    在过去的一个小时里 我改变了几件事 并一步步提交它们 但我刚刚意识到我忘记在一些提交之前添加更改的文件 日志看起来像这样 GIT TidyUpRequests u 1 d 0 gt git log commit fc6734b6351f6c
  • 抽象类型集合的获取策略

    所以情况是这样的 假设我有一个用于表示灵活搜索的类结构 public class SearchDefinition public virtual string Name get set public virtual IEnumerable