C# 实体框架中的字符串匹配问题。适用于字符串文字,但不适用于字符串变量

C# 实体框架中的字符串匹配问题。适用于字符串文字,但不适用于字符串变量,c#,linq,entity-framework,C#,Linq,Entity Framework,我试图使用C#中的实体框架从表中获取一行。我有一个名为“TipoPlanta”的表,主键为“Tipo”,类型为String 当我尝试使用字符串从表中获取一行时,我只能在使用字符串文本时才能找到一些内容。如果使用传递给方法的字符串,则找不到行 我有下面的方法,其中添加了一些我一直试图调试的东西。我传递字符串tipoString,在本例中该字符串的值为“Arbol persistente”。代码如下: private TipoPlanta getTipoPlanta(String t

我试图使用C#中的实体框架从表中获取一行。我有一个名为“TipoPlanta”的表,主键为“Tipo”,类型为String

当我尝试使用字符串从表中获取一行时,我只能在使用字符串文本时才能找到一些内容。如果使用传递给方法的字符串,则找不到行

我有下面的方法,其中添加了一些我一直试图调试的东西。我传递字符串tipoString,在本例中该字符串的值为“Arbol persistente”。代码如下:

        private TipoPlanta getTipoPlanta(String tipoString)
    {
        try
        {
            if (tipoString == "Arbol persistente")
                Console.WriteLine("They are the same");
            else
                Console.WriteLine("They are different");

            var result = (from tar in plantaContext.TipoPlanta where tar.Tipo.Contains(tipoString) select tar);
            var sql = ((System.Data.Objects.ObjectQuery)result).ToTraceString();
            Console.WriteLine("SQL = " + sql);
            Console.WriteLine("RESULT COUNT = " + result.Count());
            Console.WriteLine();

            var resultLiteral = (from tar in plantaContext.TipoPlanta where tar.Tipo.Contains("Arbol persistente") select tar);
            var sql2 = ((System.Data.Objects.ObjectQuery)resultLiteral).ToTraceString();
            Console.WriteLine("SQL2 = " + sql2);
            Console.WriteLine("RESULT LITERAL COUNT = " + resultLiteral.Count());

            TipoPlanta tipo = result.First<TipoPlanta>();
            //              TipoPlanta tipo = (from tar in plantaContext.TipoPlanta where tar.Tipo.Contains("Arbol persistente") select tar).First();
            //TipoPlanta tipo = (from  in plantaContext.TipoPlanta where t.Tipo.CompareTo(tipoString.Trim()) == 0 select t).First();
            return tipo;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            log("Tipo", tipoString, "no existe.");
            return null;
        }
    }
可以看出,当我使用字符串文字时,它会找到行,但当我使用传递的字符串时,它不会找到行,即使它们看起来是相同的


有什么想法吗

您似乎有编码问题。tipoString和字符串常量在调试器中可能看起来相同,==可能返回true,但某些字符的编码不同

将tipoString与字符串常量进行比较时,请使用string.compare(tipoString,“Arbol persistente”,StringComparison.CurrentCulture);而不是==运算符

如下列文件所述:

比较字符串时,应使用显式指定要执行的比较类型的方法。这使您的代码更易于维护和可读。尽可能使用System.String和System.Array类的方法重载,这些方法采用StringComparison枚举参数,以便指定要执行的比较类型。最好避免使用==和!=比较字符串时使用运算符。另外,避免使用String.CompareTo实例方法,因为所有重载都不接受StringComparation


如果这没有帮助,那么我同意Daniel的观点-请查看使用SQL Server Profiler执行的实际SQL语句(假设您的数据在SQL Server中)。

您可以使用SQL Server Profiler设置跟踪以查看针对数据库执行的确切内容吗?这可能更好地揭示问题的本质。特别是,我非常想知道
@p\uu linq\uu 1
传递了什么值。
SQL = SELECT
[Extent1].[Tipo] AS [Tipo]
FROM [TipoPlanta] AS [Extent1]
WHERE (CHARINDEX(@p__linq__1, [Extent1].[Tipo])) > 0
RESULT COUNT = 0

SQL2 = SELECT 
[Extent1].[Tipo] AS [Tipo]
FROM [TipoPlanta] AS [Extent1]
WHERE (CHARINDEX(N'Arbol persistente', [Extent1].[Tipo])) > 0
RESULT LITERAL COUNT = 1