Я написал запрос LINQ, в котором я ищу базу данных SQL с несколькими строками. В демонстрационных целях я жестко закодирую строки поиска как ["term1", "term2"]:
var terms = ["term1", "term2"];
var queryableTerms = terms.AsQueryable();
var results = await(
from row in _context.table
where
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 ''
)
)
Подробнее здесь: https://stackoverflow.com/questions/788 ... ed-results