Я написал запрос LINQ, в котором я ищу базу данных SQL с несколькими строками. В демонстрационных целях я жестко закодирую строки поиска как ["term1", "term2"]:
var terms = ["term1", "term2"];
var queryableTerms = terms.AsQueryable();
var results = await(
from row in _context.table
where
row.col1 != null && row.col2 != null && row.col3 != null && row.col4 != null
&& queryableTerms.All(term =>
row.col1.Contains(term)
|| row.col2.Contains(term)
|| row.col3.Contains(term)
|| row.col4.Contains(term))
select row
)
.ToListAsync();
...
Этот код возвращает около 60 результатов. Однако, если я определю термины наоборот, как ["term2", "term1"], я получу около 250 результатов. Что может вызвать это?
Кроме того, если я явно проверю все столбцы следующим образом:
...
&& (row.col1.Contains(terms[0])
|| row.col2.Contains(terms[0])
|| row.col3.Contains(terms[0])
|| row.col4.Contains(terms[0]))
&& (row.col1.Contains(terms[1])
|| row.col2.Contains(terms[1])
|| row.col3.Contains(terms[1])
|| row.col4.Contains(terms[1]))
...
Я получаю около 350 результатов из базы данных.
Что я делаю не так? Я попросил других людей проверить мой настоящий код, и в этом нет ничего плохого. Похоже, проблема связана с поведением LINQ. Можно ли это исправить, используя вместо этого синтаксис метода?
Спасибо за внимание.
РЕДАКТИРОВАТЬ: Вот SQL, в который LINQ преобразует< /p>
SELECT *
FROM [dbo].[table] AS [c]
WHERE [c].[col1] IS NOT NULL AND [c].[col2] IS NOT NULL AND [c].[col3] IS NOT NULL AND [c].[col4] IS NOT NULL AND NOT EXISTS (
SELECT 1
FROM (VALUES (CAST('term1' AS char(12))), ('term2')) AS [v]([Value])
WHERE NOT (CHARINDEX([v].[Value], UPPER([c].[col1])) > 0 OR [v].[Value] LIKE '' OR CHARINDEX([v].[Value], UPPER([c].[col2])) > 0 OR [v].[Value] LIKE '' OR CHARINDEX([v].[Value], UPPER([c].[col3])) > 0 OR [v].[Value] LIKE '' OR CHARINDEX([v].[Value], UPPER([c].[4])) > 0 OR [v].[Value] LIKE ''))
То же, что и выше, переформатированное для улучшения читабельности:
SELECT *
FROM dbo.table AS c
WHERE c.col1 IS NOT NULL
AND c.col2 IS NOT NULL
AND c.col3 IS NOT NULL
AND c.col4 IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM (
VALUES
(CAST('term1' AS char(12))),
('term2')
) AS v(Value)
WHERE NOT (
CHARINDEX(v.Value, UPPER(c.col1)) > 0
OR v.Value LIKE ''
OR CHARINDEX(v.Value, UPPER(c.col2)) > 0
OR v.Value LIKE ''
OR CHARINDEX(v.Value, UPPER(c.col3)) > 0
OR v.Value LIKE ''
OR CHARINDEX(v.Value, UPPER(c.4)) > 0 -- ??? c.col4 ???
OR v.Value LIKE ''
)
)
РЕДАКТИРОВАТЬ: Вот некоторая информация о данных, возвращаемых двумя порядками терминов:
В интересах ясности предположим, что все совпадения происходят в столбце 1. Если термины такие: ["term1", "term2"], все результаты будут примерно такими:
"abcterm1 term2"
"123term1 abcterm2"
"term1 term2"
"term123 term2"
"abcterm1 term2"
"term1 term2"
etc...
с другой стороны, если условия поменять местами: ["term2", "term1"], результаты будут выглядеть примерно так:
"term2 term1"
"term2 abcterm1"
"term234 term1"
"123term2 12term1"
etc...
Подробнее здесь: https://stackoverflow.com/questions/788 ... ed-results
Запрос LINQ с использованием .All() возвращает меньше ожидаемых результатов. ⇐ C#
Место общения программистов C#
1722911642
Anonymous
Я написал запрос LINQ, в котором я ищу базу данных SQL с несколькими строками. В демонстрационных целях я жестко закодирую строки поиска как ["term1", "term2"]:
var terms = ["term1", "term2"];
var queryableTerms = terms.AsQueryable();
var results = await(
from row in _context.table
where
row.col1 != null && row.col2 != null && row.col3 != null && row.col4 != null
&& queryableTerms.All(term =>
row.col1.Contains(term)
|| row.col2.Contains(term)
|| row.col3.Contains(term)
|| row.col4.Contains(term))
select row
)
.ToListAsync();
...
Этот код возвращает около 60 результатов. [b]Однако, если я определю термины наоборот, как ["term2", "term1"], я получу около 250 результатов[/b]. Что может вызвать это?
Кроме того, если я явно проверю все столбцы следующим образом:
...
&& (row.col1.Contains(terms[0])
|| row.col2.Contains(terms[0])
|| row.col3.Contains(terms[0])
|| row.col4.Contains(terms[0]))
&& (row.col1.Contains(terms[1])
|| row.col2.Contains(terms[1])
|| row.col3.Contains(terms[1])
|| row.col4.Contains(terms[1]))
...
Я получаю около 350 результатов из базы данных.
Что я делаю не так? Я попросил других людей проверить мой настоящий код, и в этом нет ничего плохого. Похоже, проблема связана с поведением LINQ. Можно ли это исправить, используя вместо этого синтаксис метода?
Спасибо за внимание.
РЕДАКТИРОВАТЬ: Вот SQL, в который LINQ преобразует< /p>
SELECT *
FROM [dbo].[table] AS [c]
WHERE [c].[col1] IS NOT NULL AND [c].[col2] IS NOT NULL AND [c].[col3] IS NOT NULL AND [c].[col4] IS NOT NULL AND NOT EXISTS (
SELECT 1
FROM (VALUES (CAST('term1' AS char(12))), ('term2')) AS [v]([Value])
WHERE NOT (CHARINDEX([v].[Value], UPPER([c].[col1])) > 0 OR [v].[Value] LIKE '' OR CHARINDEX([v].[Value], UPPER([c].[col2])) > 0 OR [v].[Value] LIKE '' OR CHARINDEX([v].[Value], UPPER([c].[col3])) > 0 OR [v].[Value] LIKE '' OR CHARINDEX([v].[Value], UPPER([c].[4])) > 0 OR [v].[Value] LIKE ''))
То же, что и выше, переформатированное для улучшения читабельности:
SELECT *
FROM dbo.table AS c
WHERE c.col1 IS NOT NULL
AND c.col2 IS NOT NULL
AND c.col3 IS NOT NULL
AND c.col4 IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM (
VALUES
(CAST('term1' AS char(12))),
('term2')
) AS v(Value)
WHERE NOT (
CHARINDEX(v.Value, UPPER(c.col1)) > 0
OR v.Value LIKE ''
OR CHARINDEX(v.Value, UPPER(c.col2)) > 0
OR v.Value LIKE ''
OR CHARINDEX(v.Value, UPPER(c.col3)) > 0
OR v.Value LIKE ''
OR CHARINDEX(v.Value, UPPER(c.4)) > 0 -- ??? c.col4 ???
OR v.Value LIKE ''
)
)
РЕДАКТИРОВАТЬ: Вот некоторая информация о данных, возвращаемых двумя порядками терминов:
В интересах ясности предположим, что все совпадения происходят в столбце 1. Если термины такие: ["term1", "term2"], [b]все[/b] результаты будут примерно такими:
"abcterm1 term2"
"123term1 abcterm2"
"term1 term2"
"term123 term2"
"abcterm1 term2"
"term1 term2"
etc...
с другой стороны, если условия поменять местами: ["term2", "term1"], результаты будут выглядеть примерно так:
"term2 term1"
"term2 abcterm1"
"term234 term1"
"123term2 12term1"
etc...
Подробнее здесь: [url]https://stackoverflow.com/questions/78834560/linq-query-using-all-returns-fewer-than-expected-results[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия