几个属性的 NHibernate QueryOver 条件

NHibernate QueryOver condition on several properties

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

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

现在,用户的设计想法是包含 makemodelversion 连接的单个字符串,因此条目是该单个字符串。假设他们想要查找制造商 FH、型号 TT、版本 27 的规格,他们会想到(并键入)"FHTT27"。

我们使用一个 IQueryOver 对象,我们根据条件在其上添加连续的条件。对于设计,我们的代码是

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

这会引发 InvalidOperationException,"variable 'armor' of type 'IArmor' referenced from scope '', but it is not defined"。

这在此处被描述为错误: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",即上面的代码会解析错误。所以我不能那样绕过困难。我也不能使用正则表达式。

我也不能在我的 Armor class 中创建一个 属性 来连接所有三个属性,因为它不能被 NHibernate 转换为 SQL。

有人知道怎么做吗?

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

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

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