Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Неправильный результат выборки при использовании string.Contains(string) / 8 сообщений из 8, страница 1 из 1
27.10.2014, 17:04
    #38788444
Nickopoll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильный результат выборки при использовании string.Contains(string)
EF6. Использую последнюю версию SQLite.EF6.
Результат запроса:
Код: c#
1.
2.
3.
4.
stateWorkerIDs = from state in directory.States
				from cityName in cityNames
				where state.Name.Contains(cityName)
				select state.ID;


возвращает 7 записей: 1 правильную и 6 неправильных и генерит SQL:
Код: sql
1.
2.
3.
4.
SELECT 
[Extent1].[ID] AS [ID]
FROM [States] AS [Extent1]
WHERE (CHARINDEX('Київ', [Extent1].[Name])) = 1



Результат запроса:
Код: c#
1.
2.
3.
4.
stateWorkerIDs = from state in directory.States
				from cityName in cityNames
				where state.Name.StartsWith(cityName)
				select state.ID;


возвращает 14 записей: 1 правильную и 13 неправильных и генерит SQL:
Код: sql
1.
2.
3.
4.
SELECT 
[Extent1].[ID] AS [ID]
FROM [States] AS [Extent1]
WHERE (CHARINDEX('Київ', [Extent1].[Name])) > 0



cityNames - это IEnumerable<string>.
Почему такое происходит и как можно исправить? Если я правильно понимаю, SQLite провайдер генерит понятный для БД запрос. Но в SQLite вроде как нет функции CHARINDEX. Как провайдер тогда мог транслировать Contains в CHARINDEX?
...
Рейтинг: 0 / 0
28.10.2014, 09:53
    #38788929
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильный результат выборки при использовании string.Contains(string)
а как по вашему должно выглядеть ваш запрос? напишите запрос на обычном скул. увидите свою ошибку.
...
Рейтинг: 0 / 0
29.10.2014, 13:53
    #38790670
Nickopoll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильный результат выборки при использовании string.Contains(string)
handmadeFromRu,

Написал бы с обычным like. В чем же моя ошибка?
...
Рейтинг: 0 / 0
29.10.2014, 14:16
    #38790719
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильный результат выборки при использовании string.Contains(string)
Во-первых, в первом сообщении явно перепутаны между собой полученные SQL-запросы.

Во-вторых, вы не приводите конкретных данных "1 правильную и 6 неправильных", нам нечего даже оценить

В-третьих, к SQLite подключаются расширяющие библиотеки, которые могут содержать CHARINDEX в том числе
...
Рейтинг: 0 / 0
30.10.2014, 09:33
    #38791423
Nickopoll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильный результат выборки при использовании string.Contains(string)
Shocker.Pro,

Точно, перепутал запросы.
Запрос Contains():
Код: sql
1.
2.
3.
4.
5.
SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[Name] AS [Name]
FROM [States] AS [Extent1]
WHERE (CHARINDEX('Київ', [Extent1].[Name])) > 0


дает результат:
Дніпропетровська область
Житомирська область
Закарпатська область
Івано - Франківська область
Київська обл
Кіровоградська область
Миколаївська область
Полтавська область
Тернопільська область
Харківська область
Хмельницька область
Черкаська область
Чернівецька область
Чернігівська область
...
Рейтинг: 0 / 0
30.10.2014, 09:45
    #38791445
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильный результат выборки при использовании string.Contains(string)
Nickopoll,
напишите запрос с like и передачей в него массива(cityNames внешняя коллекция для sql если я правильно понимаю). У вас выход один материализовать и в памяти уже обработать через Contains.

для теста можете сделать так
Код: c#
1.
2.
3.
stateWorkerIDs = from state in directory.States
				where state.Name.Contains("ляляляля")
				select state.ID;


и должен быть в sql like
...
Рейтинг: 0 / 0
30.10.2014, 11:56
    #38791509
Nickopoll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильный результат выборки при использовании string.Contains(string)
handmadeFromRu,

Мда, с like я поспешил - на то, что передается массив не обратил внимание, спасибо.
Но все же, я не понимаю, почему CHARINDEX при передачи просто константы 'Київ' (не в массиве) дает тот же странный результат?

"Материализовать" в смысле вернуть коллекцию областей и делее LINQ to Objects? Да так я и сделал пока что. В связи с этим вопрос: как этот влияет на производительность? Ведь SQLite - встраиваемая БД и все операции все равно выполняются у клиента в памяти. Если возвращать все записи из таблицы, а потом обрабатывать с помощью LINQ to Objects, что-то изменится?
...
Рейтинг: 0 / 0
30.10.2014, 13:01
    #38791601
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильный результат выборки при использовании string.Contains(string)
NickopollНо все же, я не понимаю, почему CHARINDEX при передачи просто константы 'Київ' (не в массиве) дает тот же странный результат?

ну поиск беглый по so пишут что должен быть like, не работал с SQLite и не могу судить. Надо смотреть в сорсы если вообще есть.

Nickopoll"Материализовать" в смысле вернуть коллекцию областей и делее LINQ to Objects?

ага вернуть список
Код: c#
1.
2.
3.
4.
5.
6.
7.
var stateTemp = (from state in directory.States			
				select new {state.ID , state.Name}).ToList();

stateWorkerIDs = from state in stateTemp 
				from cityName in cityNames
				where state.Name.Contains(cityName)
				select state.ID;


Nickopoll В связи с этим вопрос: как этот влияет на производительность?

памяти сожрет больше, так как больше данных перелопатить и чуть медленнее будет. Все зависит на сколько бд большая. Можешь поизголяться и в цикле проходить по cityNames и для каждого города вытаскиваться state.ID (правда если like не получается то вариант отпадает) а потом запихивать в общий списко id если такого не было. тут даже set<int> уместнее будет если не хочешь проверки делать был ли элемент или нет. Но тогда у тебя будет n- запросов в бд, вместо 1 большого. Экспериментируй либ долбить бд либ в память загрузить быстрее будет.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Неправильный результат выборки при использовании string.Contains(string) / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]