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

C# check string contain a word with underscores

我想获取所有包含“_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();

在 SQL 中,下划线(和百分比)是通配符。 NHibernate 不会自动转义它们,因为您可以使用它们。 .Contains后面还有SQL的LIKE.

转义通配符取决于底层 DBMS。

试试这个:

d.Nom.Contains("\_AT\_")

(它可能不起作用。请参阅您的数据库引擎的文档。)

上面给出的 none 解决方案会以某种方式正确转义下划线(我试过 \_ @\_ [_] $_ ^_)所以我最终在纯 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();

这显然不是最好的解决方案,因为它从数据库中检索的行数比必要的多,并在内存中再次过滤,但就我而言,开销是可以接受的。