Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#检查字符串包含带下划线的单词_C#_String_Nhibernate_Contains_Linq To Nhibernate - Fatal编程技术网

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

C#检查字符串包含带下划线的单词,c#,string,nhibernate,contains,linq-to-nhibernate,C#,String,Nhibernate,Contains,Linq To Nhibernate,我想获取所有包含“\u AT”或“PV”的项目, 但是d.Nom.Contains($“PV”)和d.Nom.Contains($“\u AT”)还获取仅包含“AT”和“PV”的项 IQueryable docPV=NHibernateSession.Current.Query() .其中(d=>d.identitorattachment==missionId &&d.Nom.包含($“PV”) &&d.Desactive==假) .OrderByDescending(d=>d.DateDern

我想获取所有包含“\u AT”或“PV”的项目, 但是
d.Nom.Contains($“PV”)和
d.Nom.Contains($“\u AT”)
还获取仅包含“AT”和“PV”的项

IQueryable docPV=NHibernateSession.Current.Query()
.其中(d=>d.identitorattachment==missionId
&&d.Nom.包含($“PV”)
&&d.Desactive==假)
.OrderByDescending(d=>d.DateDerniereModif);
IList docAR=NHibernateSession.Current.Query()
.其中(d=>d.identitorattachment==missionId
&&d.Nom.包含($“\u AT\u”)
&&d.Desactive==假)
.OrderByDescending(d=>d.DateDerniereModif).ToList();
在SQL中,下划线(和百分比)是通配符。NHibernate不会自动逃避它们,因为你可以利用它们。在
.Contains
的后面,有SQL的
类似于

转义通配符取决于底层DBMS

试试这个:

d.Nom.Contains("\\_AT\\_")
(可能不起作用。请参阅数据库引擎的文档。)

在SQL中,下划线(和百分比)是通配符。NHibernate不会自动逃避它们,因为你可以利用它们。在
.Contains
的后面,有SQL的
类似于

转义通配符取决于底层DBMS

试试这个:

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

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

不知何故,上面给出的任何解决方案都无法正确地跳出下划线(我尝试了
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

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

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

不知何故,上面给出的任何解决方案都不能正确地跳出下划线(我尝试了
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\因此,我最终再次在纯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();

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

&&(d.Nom.Contains($“PV”)| d.Nom.Contains($“\u AT”))
?您是否询问如何组合这些条件?与SQL中的
&&(d.Nom.Contains($“PV|”)| | d.Nom.Contains($”| AT|))
一样,下划线(和百分比)是通配符。你必须逃离他们。您很可能会在文档中找到。这是因为下划线用作通配符吗?这有帮助吗?(即d.Nom.Contains(@“PV”)-注意,您需要“@”,因为\本身是一个转义字符。不要因为不清楚而结束这个问题。嗯,这是一个明确的问题:筛选
包含(“\u AT”
”也会查找仅在“
”处包含
”的字符串(但它可能是重复的)。
&(d.Nom.Contains($“PV”)\124; d.Nom.Contains($”包含($“\u AT”))
?你是在问如何组合这些条件吗?正如在SQL中,下划线(和百分比)是通配符。你很可能会在文档中找到。这是因为下划线充当通配符吗?这有帮助吗?(即,d.Nom.Contains(@“PV”)-注意,您需要“@”,因为\本身是一个转义字符。不要因为不清楚而关闭此问题。嗯,这是一个明确的问题:筛选
包含(“\u AT”)
也会查找仅在“
处包含
”或
包含(@“\\u AT\”)的字符串
我测试了这两个代码,但它们不起作用。然后我使用
名称替换(“",“|”)。包含(“PV |”)
听起来像是一个有效的解决方案。但是,它有两个缺点:您无法区分“PV |”和“PV |”,并且数据库不会使用索引。当数据库运行类似于
时,通常无法使用索引。但可能会有一些特殊的优化,例如,当使用
StartsWith
而不是
Contains
时。这取决于数据库。您使用什么数据库?对于许多常见的数据库,它通常可以使用索引(对于一些工作)例如,假设模式包含一个非通配符的初始部分。@Oskarbergren:是的,这就是为什么我说
StartsWith
,而不是
contains
。或者
。contains(@“\\u AT\”)
我测试了这两个代码,但它们不起作用。然后我使用
Nom.Replace(“,”).contains(“PV”)
听起来像是一个可行的解决方案。但是,它有两个缺点:您无法区分“PV|”和“PV|”,并且数据库不会使用索引。当数据库运行类似于
时,通常无法使用索引。但可能会有一些特殊的优化,例如,当使用
StartsWith
而不是
Contains
时。这取决于数据库。您使用什么数据库?对于许多常见的数据库,它通常可以使用索引(对于某些工作)对于LIKE,假设模式包含非通配符的初始部分。@Oskarbergren:是的,这就是为什么我说
StartsWith
而不是
contains