C#检查字符串包含带下划线的单词

时间:2018-04-10 10:13:29

标签: c# string nhibernate contains linq-to-nhibernate

我希望获得包含“ _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();

2 个答案:

答案 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();

这显然不是最佳解决方案,因为它从数据库中检索了比必要数量更多的行,并再次在内存中进行过滤,但是在我看来,这种开销是可以接受的。