关于几个属性的NHibernate QueryOver条件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于几个属性的NHibernate QueryOver条件相关的知识,希望对你有一定的参考价值。

我有这个armor表,有三个字段来识别个别设计:makemodelversion

我必须为我们的软件实现搜索功能,让用户根据各种标准搜索装甲,其中包括他们的设计。

现在,用户对设计的想法是包含makemodelversion连接的单个字符串,因此条目是单个字符串。假设他们想要查看制作FH,型号TT,版本27的规格,他们会想到(并输入)“FHTT27”。

我们使用IQueryOver对象,我们根据标准添加连续条件。对于设计,我们的代码是

z_quoQuery = z_quoQuery.And(armor => armor.make + armor.model + armor.version == z_strDesign);

这引发了一个InvalidOperationException,“从范围''引用的'IArmor'类型的”变量'armor',但它没有定义“。

这被描述为一个错误:https://github.com/mbdavid/LiteDB/issues/637

经过大量的试验和错误,似乎不使用armor变量的语法首先引发该异常。

显然,至少我现在必须走另一条路,但经过一段时间的寻找,我似乎无法找到。我想过用类似的东西

z_quoQuery = z_quoQuery.And(armor => armor.make == z_strDesign.SubString(0, 2).
                        And(armor => armor.model == z_strDesign.SubString(2, 2).
                        And(armor => armor.version == z_strDesign.SubString(4, 2);

不幸的是,这些字段可能有不同的长度。例如,makemodelversion的另一组值可能分别是“NGI”,“928”和“RX”,上面的代码将解析错误。所以我无法绕过这种困难。我也不能使用RegEx。

我也不能在我的Armor类中组成一个连接所有三个属性的属性,因为它不能被NHibernate转换为SQL。

有人知道怎么做吗?

也许我应该在这里使用一个明确的SQL条件,但它会如何与其他条件混合?

答案

看来你可以使用Projections.Concat来解决你的问题:

z_quoQuery = z_quoQuery.And(armor => Projections.Concat(armor.make, armor.model, armor.version) == z_strDesign);

以上是关于关于几个属性的NHibernate QueryOver条件的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate Invalid Cast - 使用查询时属性类型不匹配

带或不带存储库的 NHibernate

Fluent NHibernate - NHibernate.QueryException:无法解析属性

使用自动映射时如何使用 Fluent NHibernate Validator?

NHibernate:映射具有属性的复杂值类型?

Nhibernate:只读属性导致急切加载