NHibernate 3 - 扩展 Linq 提供程序 BaseHqlGeneratorForMethod.BuildHql 问题

2024-01-07

我想用我自己的方法扩展 NHibernate 3 的默认 LINQ 提供程序。我希望能够使用 POCO 中的一些方法。我有一个名为 Range 的组件,它在我的许多 POCO 中经常使用。这个 nhibernate 组件类有一个 Contains(int value) 方法,我想在 LINQ 查询表达式中使用它

Mapping:

<class name="Foo">
  ...
  <component name="AgeRange">
    <property name="Min" column="age_min" />
    <property name="Max" column="age_max" />
  </component>
</class>

Class

public class Range {
  public int Min { get; set; }
  public int Max { get; set; }

  public bool Contains(int value) {
    return value >= this.Min && value <= this.Max;
  }
}

// this is the LINQ query I want to be able to write
// which will generate 'SELECT * FROM Foo WHERE 25 BETWEEN age_min AND age_max'
var s = from x in session.Query<Foo> where x.AgeRange.Contains(25) select x;

// I know the following works
var s = from x in session.Query<Foo> where x.AgeRange.Min <= 25 && x.AgeRange.Max >= 25 select x;

我查看了几篇解释如何扩展 LINQ 提供程序的博客文章,但我不知道如何构建其工作所需的表达式。

public class RangeContainsGenerator : BaseHqlGeneratorForMethod
{
    public MemberInfo RangeMin;
    public MemberInfo RangeMax;

    public RangeContainsGenerator() {
        SupportedMethods = new[] { 
            ReflectionHelper.GetMethodDefinition<Range>(x=> x.Contains(0)),
        };

        RangeMin = ReflectionHelper.GetProperty<Range, int>(x => x.Min);
        RangeMax = ReflectionHelper.GetProperty<Range, int>(x => x.Max);
    }

    public override NHibernate.Hql.Ast.HqlTreeNode BuildHql(
        System.Reflection.MethodInfo method, 
        System.Linq.Expressions.Expression targetObject, 
        System.Collections.ObjectModel.ReadOnlyCollection<System.Linq.Expressions.Expression> arguments, 
        NHibernate.Hql.Ast.HqlTreeBuilder treeBuilder, 
        NHibernate.Linq.Visitors.IHqlExpressionVisitor visitor) {
            // The targetObject parameter contains the "Foo.AgeRange" member access expression
            throw new NotImplementedException(); 
    }
}

在 BuildHql 方法中,我不知道如何访问 Range 类的 Min 和 Max 属性来构建 HqlTreeNode


  1. 您可以采用手动方法:最简单的方法是创建代表您想要的内容的 LINQ 树:arguments[0] >= targetObject.Min && arguments[1] <= targetObject.Max. Here >= is Expression.GreaterThenOrEqual, . is Expression.Property等等。

    当你有一个表达式树时,只需应用visitor并返回它返回的内容(我不记得确切的 API,但如果需要其他帮助,我可以查看它)。

  2. 另一个解决方案可能是尝试我的小图书馆:富有表现力 http://nuget.org/List/Packages/Expressive.
    它尝试将方法 IL 转换为表达式,因此您可以执行以下操作LinqToHqlGeneratorsRegistry or IRuntimeMethodHqlGenerator试图内联any未知的属性/方法。

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

NHibernate 3 - 扩展 Linq 提供程序 BaseHqlGeneratorForMethod.BuildHql 问题 的相关文章

  • 使用 Linq 进行异步Where过滤

    我有一个List通过填充的元素async调用 WebService 没问题 我需要过滤该列表以便在应用程序视图上显示某些内容 我试过这个 List
  • 使用 AutoMapper 进行 LINQ GroupBy 聚合

    试图让查询工作 但老实说不确定如何 或者是否可能 进行它 因为我尝试过的一切都不起作用 共查询6个表 Person PersonVote PersonCategory Category City FirstAdminDivision Per
  • 为什么我不能在扩展 List 的类中调用 OrderBy?

    我有一堂课 Deck 其中包含一个名为的方法Shuffle 我正在致力于重构Deck延长List
  • Linq 合并列表

    我的课 public class Foo public int A get set public List
  • EF 5.0 中的链接 OR 条件

    我将以此为序言 我正在积极寻找这个问题的解决方案 但我想 如果堆栈上有人已经解决了这个问题 我可能会缩短一些研究和开发时间 我在网上没有找到任何东西 所以这里是 我们正在构建的应用程序框架中有一个案例 我们需要能够接受一组谓词 List
  • LINQ 中的延迟执行有什么好处?

    LINQ 使用延迟执行模型 这意味着在调用 Linq 运算符时不会返回结果序列 而是这些运算符返回一个对象 然后仅当我们枚举该对象时 该对象才会生成序列的元素 虽然我了解延迟查询的工作原理 但我在理解延迟执行的好处时遇到了一些困难 1 我读
  • NHibernate:如何从会话缓存中获取实体实例?

    我在工作单元开始时开始会话 并在工作单元结束时关闭 工作单元分布在多种方法中 在一种方法中 我使用加载实体Get方法 所以它位于会话缓存中 实体实例对于方法来说是本地的 因此 当方法范围结束时 实体实例将无法访问 但实体仍在会话缓存中 现在
  • NHibernate Criteria API 是否支持集合属性的投影?

    我需要使用条件 API 复制以下工作 HQL 查询 session CreateQuery select c from Parent p inner join p Children c where p Id 9 and c Id 33 Se
  • 是一对一的关系不好的策略

    用户始终拥有一个钱包 一个钱包始终属于一位用户 由于我想分离与钱夹相关的属性 我创建了 Wallet 对象并能够跟踪钱交易 我创建了 public Wallet Entity
  • 使用 LINQ 迭代类属性

    有一个 ParsedTemplate 类 它有超过 300 个属性 类型为 Details 和 BlockDetails parsedTemplate 对象将由函数填充 填充这个对象后 我需要一个 LINQ 或其他方式 来查找是否有任何属性
  • Linq 选择与另一个表中的 ID 相等的项目

    我不确定这怎么可能 但我有两个表 我想通过表 1 的值从表 2 中获取值 表 1 有一个名为 rank 的外键 它是int 表 2 有一个名为 name 的值 它是string 现在表 1 的 排名 与表 2 的 ID 相关 所以当我说 v
  • 如何使用 Linq 将实体表与交叉引用表连接起来

    首先我要说的是 我对 Linq 比较陌生 但我似乎很快就掌握了其中的大部分内容 但这个问题却难倒了我 我找了又找都没有结果 我使用代码优先并创建了 2 个模型 项目 和 关键字 他们之间存在多对多的关系 我的实体模型如下所示 public
  • 过滤项目来源

    通过此代码 我设置了数据网格的 ItemsSource 不过 我有更多的 wpf 控件来过滤数据网格 例如从时间范围过滤数据网格 我可以为此编写一个新查询 但这似乎没有必要 因为数据已经可用 我只需要过滤它 最好的方法是什么 我能得到的任何
  • LINQ 对特定属性的 Distinct()

    我正在玩 LINQ 来了解它 但我不知道如何使用Distinct https learn microsoft com en us dotnet api system linq enumerable distinct当我没有一个简单的列表时
  • NHibernate:级联保存到子级不会插入

    我有一个像这样的双向关联 public class Parent public int ParentId get set other properties public IEnumerable
  • 在 Linq 查询中使用动态列名称

    foreach Dimension dimensions in Enum GetValues typeof Dimension var r new ReferenceTable dimensions referenceItems List
  • 使用左连接获得不适当的输出

    我正在尝试获取变体列表 并且对于每个变体都获取所有subvariants list无论子变体属于何处 特别的Test say 100 这是示例数据 Id TestId SourceSubVariantId TargetSubVariantI
  • LINQ to Entities 无法识别“Int32 IndexOf(System.String, System.StringComparison)”方法

    我已经使用 Entityframework 执行了 linq 查询 如下所示 GroupMaster getGroup null getGroup DataContext Groups FirstOrDefault item gt keyw
  • 更改 NHibernate Session.Save 命令超时

    我们有几个长时间运行的后端进程 其运行时间超过默认的 30 秒 我们的NHibernate版本是2 0 1 4000 Spring NET是1 2 0 20313 NHibernate 通过 Spring NET 进行配置
  • 无法转换类型为“NHibernate.Collection.Generic.PersistentGenericBag”的对象

    public List

随机推荐

  • LIDAR激光雷达反射板

    LIDAR Light Detection And Ranging 系统是一种集激光 全球定位系统 GPS 和惯性导航系统 INS 三种技术于一身的系统 用于获得点云数据并生成精确的数字化三维模型 LIDAR系统包括一个单束窄带激光器和一个
  • BEV+Transformer感知架构共识下,传感器「火药味」再升级

    高阶智能驾驶战火愈演愈烈 正带动感知方案卷入新一轮军备竞赛 根据高工智能汽车研究院最新发布数据显示 2023年1 9月 中国市场 不含进出口 乘用车前装标配 软硬件 NOA交付新车37 73万辆 同比上年同期增长151 20 未来几年内 N
  • 智能座舱的下一个价值“爆点”——让“光”更智能

    汽车智能化快速升级 智能座舱作为人机交互的主要窗口 交互模态 用户体验也呈现多维度升级 例如 今年下半年上市的多款高端智能车型纷纷基于高性能座舱硬件平台 集成了AR HUD DMS OMS等高阶功能 同时结合超大屏 多屏联动 联动舱内氛围灯
  • HttpRunner(20):脚手架工具使用(一键搭建)-httprunner运行方式

    脚手架工具使用 每一个成熟的系统工具 都会有对应的脚手架工具 它可以快速构建项目的必要目录 不必自己一个一个的配置与搭建 只需要执行一些命令即可 httprunner也提供了脚手架工具 使用步骤如下 1 在命令模式下输入hrun start
  • MINI-UTDE 10 BASE-T 集成控制器

    MINI UTDE 10 BASE T 集成控制器 MINI UTDE 10 BASE T 拥有多达三个本地I O板和远程I OS总线通信 为用户提供了一系列生产单元功能的单一控制点 包括诸如夹头 反馈器和辅助机器等外围生产设备 支持所有主
  • 图神经网络与智能教育:创新教育技术的未来

    导言 图神经网络 GNNs 和智能教育技术的结合为教育领域注入新活力 本文深入研究二者的结合可能性 涉及各自侧重 当前研究动态 技术运用 实际场景 未来展望 并提供相关链接 1 图神经网络与智能教育的结合方向 1 1 图神经网络在教育技术中
  • 为什么我的图像在横向模式下消失?

    我有一张纵向模式的图像 可以正确显示 当我将配置更改为横向时 不显示图像 请注意 LinearLayout 包含ImageView显示正确 我通过更改背景进行检查 但是当我改变背景时ImageView 背景也没有显示
  • 在 VBA 中使用 filesavename 后无法在 Excel 中保存文件

    所以我在工作中使用了我不久前制作的VBA 它曾经工作得很好 但截至今天 它在打开 另存为 窗口后将不会保存我的文件 它只是转到给定的 MsgBox 最初的问题是 LDate Date 不知何故开始返回带有正斜杠的日期 我通过添加 LDate
  • 如果我在 Ruby on Rails 中有一个哈希值,有没有办法让它不影响访问?

    如果我已经有一个哈希值 我可以这样做吗 h foo h foo 是相同的 这就是所谓的无差别访问吗 详细信息 我使用以下内容加载了此哈希initializers但可能不会有什么不同 SETTINGS YAML load file RAILS
  • 是什么导致了这个 Maven/JBehave 错误?

    我有一个生成 Mule 连接器的 Maven 项目 它基本上是一个 shell 因此我开始使用 JBehave 添加一些 BDD 测试 我添加的第一个测试作用很小 public class FakeSteps extends Embedde
  • Vue 组件返回多个表行

    我试图从单个组件返回两个 tr 元素v design row 我知道 vue 要求将模板元素包装在 div 中 但由于 html 表需要标签结构 我无法将它们包装在 div 中 当我添加第二个时tr in the v design row组
  • 写入 MS Access 表,python win32com

    我正在使用 python 的 win32com client 来尝试向 MS Access 表写入 插入一行 我找到了如何连接和查询 Access 表的示例here https win32com goermezer de content v
  • 有条件渲染图像时 React 中的图像闪烁问题

    我有一个标题 当鼠标悬停在标题上方时 我想在其右侧显示图像 我正在维护一个变量editMode在设置为 true false 的状态下 然后我使用 onMouseOver 和 onMouse 事件有条件地渲染图像 现在 当我将鼠标悬停在标题
  • 您会推荐哪个 Perl 模块用于 JSON 操作?

    像往常一样 我很高兴与 CPAN 打交道 因为它满足了我们所需的一切 像往常一样 我迷路了 因为有很多东西 我能找到核心JSON https metacpan org module JSON一个人 并且对一个人感到热情JSON Tiny h
  • 路由器链接发出警告“链接是一个空元素标记,不得有“children”或使用“props.dangerouslySetInnerHTML”。”

    我第一次使用反应路线 当我尝试这个时 它给了我这个警告并且它不起作用 警告 链接是一个空元素标签 不能有children or use props dangerouslySetInnerHTML 检查Loginpanel的渲染方法 我的代码
  • 动态调用带有 varargs 参数的 C 函数

    我正在用 C 语言针对第三方库 在 HP Mercury Loadrunner 中 进行编程 该库允许其函数之一使用 varargs 样式的可变大小参数列表 我想调用这个函数 但我事先不知道我将有多少个参数 我的一位前辈创建了一个函数 可以
  • OpenFoam Win 10、Ubuntu Bash 安装失败

    我正在尝试在 Win 10 上的 ubuntu bash 上安装 OpenFoam 我按照以下步骤操作 Win 10 Ubuntu bash 上的 OpenFoam 安装 https www openfoam com download in
  • 如何在网页中使用 .svg 文件?

    我想知道如何在网页中实际使用 svg 文件 See svgweb 快速入门 http codinginparadise org projects svgweb docs QuickStart html和svgweb 项目主页 http co
  • 获取 xml 属性值作为 string[]

    我的 xml 文件有这样的内容
  • NHibernate 3 - 扩展 Linq 提供程序 BaseHqlGeneratorForMethod.BuildHql 问题

    我想用我自己的方法扩展 NHibernate 3 的默认 LINQ 提供程序 我希望能够使用 POCO 中的一些方法 我有一个名为 Range 的组件 它在我的许多 POCO 中经常使用 这个 nhibernate 组件类有一个 Conta