Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Неправильный результат выборки при использовании string.Contains(string)  [new]
Nickopoll
Member

Откуда:
Сообщений: 54
EF6. Использую последнюю версию SQLite.EF6.
Результат запроса:
stateWorkerIDs = from state in directory.States
				from cityName in cityNames
				where state.Name.Contains(cityName)
				select state.ID;

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


Результат запроса:
stateWorkerIDs = from state in directory.States
				from cityName in cityNames
				where state.Name.StartsWith(cityName)
				select state.ID;

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


cityNames - это IEnumerable<string>.
Почему такое происходит и как можно исправить? Если я правильно понимаю, SQLite провайдер генерит понятный для БД запрос. Но в SQLite вроде как нет функции CHARINDEX. Как провайдер тогда мог транслировать Contains в CHARINDEX?
27 окт 14, 17:04    [16764453]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный результат выборки при использовании string.Contains(string)  [new]
handmadeFromRu
Member

Откуда: родина Ленина!
Сообщений: 1996
а как по вашему должно выглядеть ваш запрос? напишите запрос на обычном скул. увидите свою ошибку.
28 окт 14, 09:53    [16766282]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный результат выборки при использовании string.Contains(string)  [new]
Nickopoll
Member

Откуда:
Сообщений: 54
handmadeFromRu,

Написал бы с обычным like. В чем же моя ошибка?
29 окт 14, 13:53    [16772605]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный результат выборки при использовании string.Contains(string)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21958
Во-первых, в первом сообщении явно перепутаны между собой полученные SQL-запросы.

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

В-третьих, к SQLite подключаются расширяющие библиотеки, которые могут содержать CHARINDEX в том числе
29 окт 14, 14:16    [16772775]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный результат выборки при использовании string.Contains(string)  [new]
Nickopoll
Member

Откуда:
Сообщений: 54
Shocker.Pro,

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

дает результат:
Дніпропетровська область
Житомирська область
Закарпатська область
Івано - Франківська область
Київська обл
Кіровоградська область
Миколаївська область
Полтавська область
Тернопільська область
Харківська область
Хмельницька область
Черкаська область
Чернівецька область
Чернігівська область
30 окт 14, 09:33    [16776119]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный результат выборки при использовании string.Contains(string)  [new]
handmadeFromRu
Member

Откуда: родина Ленина!
Сообщений: 1996
Nickopoll,
напишите запрос с like и передачей в него массива(cityNames внешняя коллекция для sql если я правильно понимаю). У вас выход один материализовать и в памяти уже обработать через Contains.

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

и должен быть в sql like
30 окт 14, 09:45    [16776158]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный результат выборки при использовании string.Contains(string)  [new]
Nickopoll
Member

Откуда:
Сообщений: 54
handmadeFromRu,

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

"Материализовать" в смысле вернуть коллекцию областей и делее LINQ to Objects? Да так я и сделал пока что. В связи с этим вопрос: как этот влияет на производительность? Ведь SQLite - встраиваемая БД и все операции все равно выполняются у клиента в памяти. Если возвращать все записи из таблицы, а потом обрабатывать с помощью LINQ to Objects, что-то изменится?
30 окт 14, 11:56    [16776336]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный результат выборки при использовании string.Contains(string)  [new]
handmadeFromRu
Member

Откуда: родина Ленина!
Сообщений: 1996
Nickopoll
Но все же, я не понимаю, почему CHARINDEX при передачи просто константы 'Київ' (не в массиве) дает тот же странный результат?

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

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

ага вернуть список
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 большого. Экспериментируй либ долбить бд либ в память загрузить быстрее будет.
30 окт 14, 13:01    [16776799]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить