繁体   English   中英

NHibernate查询的复杂标准:Linq还是ICriteria?

[英]Complex criteria for NHibernate query: Linq or ICriteria?

我在基本存储库模型中使用带有FluentNH配置的NH2.1和Linq2NH。 我正在尝试建立一个查询,该查询将从winform中提取各种表单字段。 该标准几乎是一系列文本框,每个文本框都有一个复选框,说明该标准是否包含通配符(仅支持星号),因此逻辑是一系列的:

...
&& Field1.IsNullOrBlank() || Field1 == Criteria1 || (Criteria1IsWildCard && Regex.Match(Field1, Criteria1.Replace("*",".*")))
&& Field2.IsNullOrBlank() || Field2 == Criteria2 || (Criteria2IsWildCard && Regex.Match(Field2, Criteria2.Replace("*",".*")))

现在,这对于Linq2Objects来说将是一个很好的选择,但是由于多种原因(自定义扩展方法,Regex检查等),它在Linq2NH查询中不会走得太远。

我创建了一个不同的搜索页面,该页面必须消化相似的数据,但是该查询是针对不同的存储库数据源执行的,该数据源需要将查询作为字符串(SalesForce SOQL)。 由于NHibernate提供了许多更复杂的,经过编译器检查的工具,所以我希望HQL是我的最后选择。

其他相关信息:

  • 为了使用Linq2Objects过滤结果而检索和缓存整个表的内容几乎是不可行的(该表大约有15,000条记录),但是更可取的是不必这样做的任何选项。
  • 用户需要具有尽可能多的通配符; 因此,使用StartsWith()/ EndsWith()/ Contains()解决方法是不可行的。

因此,问题是,您将如何设置它以针对NHibernate执行?

ICriteria ,将HQLICriteriaLinq-to-NH和任何其他API转换为SQL。 因此,由于MS-SQL Server和其他服务器不直接支持通配符,因此您不能在条件中使用通配符。

我得出的答案是使用StartsWith / EndsWith方法获取LIKE操作,然后还将所有星号替换为%。 如果条件以星号开头,请使用EndsWith,否则请使用StartsWith。 这样会将“ abc *”转换为“ abc %%”,将“ ** abc”转换为“ %% abc”,将“ * abc *”转换为“ %% abc%”,它们的评估结果与非重复的%%通配符相同在LIKE子句中。 唯一无法按指定方式工作的情况是输入的标准都不以通配符开头或结尾。 如果将“ a * c”与abc,adc和abcde进行比较,它将得出“ a%c%”而不是“ a%c”,并且将返回所有这些结果而不是排除abcde。 足够接近我的目的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM