我希望获得包含“ _AT _ ”或“ PV _ ”的所有项目,
但d.Nom.Contains($"PV_")
和d.Nom.Contains($"_AT_")
也会获得仅包含“AT”和“PV”的项目
IQueryable<DocumentMetadata> docPV = NHibernateSession.Current.Query<DocumentMetadata>()
.Where(d => d.IdEntiteRattachement == missionId
&& d.Nom.Contains($"PV_")
&& d.Desactive == false)
.OrderByDescending(d => d.DateDerniereModif);
IList<DocumentMetadata> docAR = NHibernateSession.Current.Query<DocumentMetadata>()
.Where(d => d.IdEntiteRattachement == missionId
&& d.Nom.Contains($"_AT_")
&& d.Desactive == false)
.OrderByDescending(d => d.DateDerniereModif).ToList();
答案 0 :(得分:1)
在SQL中,下划线(和百分比)是通配符。 NHibernate不会自动转义它们,因为您可以使用它们。在.Contains
后面,有SQL的LIKE
。
转义通配符取决于底层DBMS。
试试这个:
d.Nom.Contains("\\_AT\\_")
(可能无效。请参阅数据库引擎的文档。)
答案 1 :(得分:0)
不知何故,以上给出的解决方案都无法正确地避开下划线(我尝试过\\_ @\_ [_] $_ ^_
),因此我最终还是在纯LINQ中再次进行了过滤:
var list = dc.Employees.Where(a => a.Name.Contains(partial)).ToList();
if (partial.Contains("_")) // underscore is an sql wildcard character and will match anything, so filter again in .NET linq
list = list.Where(a => a.Name.Contains(partial)).ToList();
这显然不是最佳解决方案,因为它从数据库中检索了比必要数量更多的行,并再次在内存中进行过滤,但是在我看来,这种开销是可以接受的。