Проблема соответствия строк в среде Entity.Работает для строкового литерала, но не для строковой переменной - PullRequest
4 голосов
/ 29 декабря 2010

Я пытаюсь получить строку из таблицы, используя платформу сущностей в C #. У меня есть таблица с именем «TipoPlanta» с первичным ключом «Tipo», который имеет тип String.

Когда я пытаюсь получить строку из таблицы, используя строку, я могу найти что-то, только если использую строковый литерал. Если я использую строку, переданную методу, я не нахожу строк.

У меня есть следующий метод, в котором есть немного добавленного материала, который я пытался отладить. Я передаю тип 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;
        }
    }

Вывод: Они одинаковы

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

Как видно, когда я использую строковый литерал, он находит строку, но не когда я использую строку, которую я передал, даже если они кажутся одинаковыми.

Есть идеи?

1 Ответ

2 голосов
/ 09 января 2011

У вас проблема с кодировкой. tipoString и ваша строковая константа могут выглядеть одинаково в отладчике, а == может возвращать true, но иметь несколько символов в разных кодировках.

Когда вы сравниваете tipoString со строковой константой, используйте string.Compare (tipoString, "Arbol persistente", StringComparison.CurrentCulture); вместо оператора ==.

Как указано в C # Руководство по программированию :

Когда вы сравниваете строки, вы должны использовать методы, которые явно указывают, какой тип сравнения вы намереваетесь выполнить. Это делает ваш код более удобным и читаемым. По возможности используйте перегрузки методов классов System.String и System.Array, которые принимают параметр перечисления StringComparison, чтобы вы могли указать, какой тип сравнения выполнять. Лучше избегать использования операторов == и! = При сравнении строк. Кроме того, избегайте использования методов экземпляра String.CompareTo, поскольку ни одна из перегрузок не принимает StringComparison.

Если это не поможет, то я согласен с Дэниелом - пожалуйста, посмотрите, какой фактический оператор SQL выполняется с использованием SQL Server Profiler (при условии, что ваши данные есть в SQL Server).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...