2016-10-17 2 views
-2

Я теряю его ... = \C# String.Compare в FirstOrDefault от структуры объекта

Использование .NET Framework 4 Использование рамки сущности получить к MS SQL DB

(JFYI - Вот некоторые уродливые ищет код, как это для местного обслуживания и никогда не будет работать с таблицами размером более ~ 1000 строк. - набор инструментов выбрал более или менее приемлемо)

Запуск следующего кода

var itemOfInterest = entity.tbl_Items 
          .FirstOrDefault(item => 
           string.Compare(item.Name, SomeLocalItem.Name, true) == 0 
          && (string.Compare(item.tbl_Server.FQDN, SomeLocalItem.ServerFQDN, true) == 0) 
          || (string.Compare(item.Server.FQDN, WithoutDomainLocalFQDN, true) == 0) 
          ); 
.

и возвращает меня в первый (или нулевой) элемент, найденный только в

(string.Compare(item.tbl_Server.FQDN, SomeLocalItem.ServerFQDN, true) == 0) 
|| (string.Compare(item.Server.FQDN, WithoutDomainLocalFQDN, true) == 0) 

причины

При запуске

var serviceOfInterest = entity.tbl_Service 
           .Where(item => string.Compare(item.Name, SomeLocalItem.Name, true) == 0) 
           .FirstOrDefault(item => 
            (string.Compare(item.tbl_Server.FQDN, SomeLocalItem.ServerFQDN, true) == 0) 
           || (string.Compare(item.Server.FQDN, WithoutDomainLocalFQDN, true) == 0) 
           ); 

Я получаю правильный результат.

Не чувствую себя хорошо. Может быть, проблема здесь очень проста, но я не могу просто ее увидеть. Строки, сравниваемые в позиции «Имена», выглядят примерно так:

«Удивительный предмет - ручка».

«Мой Удивительный Предмет - Гран-па пистолет»

«Мой Удивительный Предмет - что-то в моем кармане - для вас»

Любая помощь приветствуется. Я даже в порядке, назвав имена для такого вопроса, но мне действительно нужен ответ.

Большое спасибо заранее.

+1

Вы используете string.Compare == 0 для проверки равенства? Я считаю, что сравнение строк с оператором == лучше понимается в Entity Framework, поскольку позволяет платформе строить запросы, анализируя объект дерева выражений, созданный из лямбда. Приоритет оператора также может быть проблемой. Если первый запрос оценивается как (a && b) || c он не будет возвращать те же результаты, что и последний запрос, который эффективно является && (b || c). –

ответ

2

Попробуйте это,

var itemOfInterest = entity.tbl_Items.FirstOrDefault(item => string.Compare(item.Name, SomeLocalItem.Name, true) == 0 && ((string.Compare(item.tbl_Server.FQDN, SomeLocalItem.ServerFQDN, true) == 0) || (string.Compare(item.Server.FQDN, WithoutDomainLocalFQDN, true) == 0))); 
+0

Вы должны шутить ... Спасибо! Извините, люди за глупый вопрос. Я не возражаю, если он будет удален администраторами. – Vital

Смежные вопросы