抽象类型集合的获取策略

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(使用前将#替换为@)

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

  • NHibernate:将 ICriteria 转换为 DetachedCriteria

    任何人都知道如何将 ICriteria 转换为 DetachedCriteria 我需要使用现有的 ICriteria 作为子查询的一部分 使用 Add Subqueries PropertyIn Name myDetachedCriter
  • 可排序的 Telerik 网格 + NHibernate、IQueryable 和 ASP.NET MVC

    我正在尝试让 Telerik 网格工作 分页工作正常 我的视图代码如下所示 Html Telerik Grid Model Name Grid Columns columns gt columns Bound o gt o ItemName
  • 如何判断一个引用的对象是否可以删除?

    我有一个名为 Customer 的对象 它将在其他表中用作外键 问题是我想知道是否可以删除 客户 即 它没有在任何其他表中引用 Nhibernate 可以做到这一点吗 你所要求的是找到的存在CustomerPK值在引用表FK列中 有很多方法
  • NHibernate - CreateCriteria 与 CreateAlias

    假设以下场景 class Project public Job Job class Job public Name 假设我想使用 Criteria API 搜索其 Job 名称为 sumthing 的所有项目 我可以使用 CreateAli
  • nhibernate:读写字符串列表

    我知道我可以使用 nhibernate 读取写入字符串列表 如下所示 HasMany x gt x Attachments KeyColumn RowId Table PostTable Element PostKey 但这会创建一个额外的
  • NHibernate HQL 相当于 T-SQL 的 TOP 关键字

    NHibernate HQL 相当于 T SQL 的 TOP 关键字是什么 另外 用非 HQL 方式说 给我一门课的前 15 个 是什么意思 在 HQL 中这实际上非常简单 var top15 session CreateQuery fro
  • NHibernate:如何从会话缓存中获取实体实例?

    我在工作单元开始时开始会话 并在工作单元结束时关闭 工作单元分布在多种方法中 在一种方法中 我使用加载实体Get方法 所以它位于会话缓存中 实体实例对于方法来说是本地的 因此 当方法范围结束时 实体实例将无法访问 但实体仍在会话缓存中 现在
  • 是一对一的关系不好的策略

    用户始终拥有一个钱包 一个钱包始终属于一位用户 由于我想分离与钱夹相关的属性 我创建了 Wallet 对象并能够跟踪钱交易 我创建了 public Wallet Entity
  • 如何将 NHibernate 与 Lucene.Net 集成

    这变得很烦人 尝试将 Lucene Net 搜索与 NHibernate 集成 我只找到了 07 年的一些信息 有没有好看的最新这个的教程 从哪里开始 下载什么等 有没有办法在其他地方设置 NHibernate Search 元数据 而不是
  • 在nhibernate中设置聚集索引

    我试图在 nhibernate 中定义一个不是 id 的属性作为聚集索引 但我发现没有办法做到这一点 谁能给我指点一下这是如何完成的 或者它是当前在 nhibernate 中不可用的东西 提前致谢 您可以使用
  • 保存时的 NHibernate FlushMode

    我已将 NHibernate 会话上的 FlushMode 属性设置为 FlushMode Never 但是当我调用 session Save User 时 无论如何都会调用数据库 这是应该如何工作的吗 我认为在我调用 Flush 之前它不
  • Breeze + NHibernate 多对一关系,避免指定关系键

    以下多对一映射正在运行 取自 NorthBreeze public partial class UserRole public virtual long ID get set public virtual long UserId get s
  • NHibernate手动控制抓取

    我正在使用 NHibernate 我想控制手动获取相关实体 这是我的示例实体 public class Post public virtual long Id get set public virtual string Title get
  • NHibernate:查找脏集合

    我知道怎么做查找脏属性 http nhforge org wikis howtonh finding dirty properties in nhibernate aspx使用NHibernate 但它似乎不适用于集合 即找出是否已在集合中
  • NHibernate 对单个属性的更新会更新 sql 中的所有属性

    我正在 NHibernate 中对单个属性执行标准更新 然而 在提交事务时 sql 更新似乎设置了我映射到表上的所有字段 即使它们没有更改 这肯定不是 Nhibernate 中的正常行为吧 难道我做错了什么 谢谢 using var ses
  • NHibernate HQL SELECT 子查询中的 TOP

    有没有办法在子查询上使用 SetMaxResult 我正在编写一个查询以返回属于最新订单的所有订单项 所以我需要限制子查询的记录数 等效的 sql 看起来像这样 SELECT i FROM tbl Orders o JOIN tbl Ord
  • NHibernate双向一对一映射问题

    当尝试在 NHibernate 中创建双向一对一映射时 我发现我无法递归地获得对象的引用 例如 假设我之间有一对一的关系Person and Address 然后执行以下代码后 class Person public Address Add
  • NHibernate 二级缓存与 NHibernate Linq Provider 1.0

    如何使用 NHibernate Linq Provider 1 0 启用 NHibernate 二级缓存 二级缓存似乎仅适用于 ICriteria 使用 是的 我终于解决了这个问题 public IQuerable
  • NHibernate、数据绑定到 DataGridView、延迟加载和会话管理 - 需要建议

    我的主应用程序窗体 WinForms 有一个 DataGridView 它使用 DataBinding 和 Fluent NHibernate 显示 SQLite 数据库中的数据 该表单在应用程序运行的整个过程中都是打开的 出于性能原因 我
  • Fluent Nhibernate 映射的单元测试

    我正在尝试了解社区的其他成员如何测试他们的 Fluent Nhibernate 映射 假设我有以下映射 public UserHeaderMap Table USER HEADER Id x gt x Id USER ID Map x gt

随机推荐

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

    我试图获取另一个集合中的对象数组中存在的元素的计数 例子 集合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