Запрос LINQ с использованием .All() возвращает меньше ожидаемых результатов.C#

Место общения программистов C#
Ответить
Anonymous
 Запрос LINQ с использованием .All() возвращает меньше ожидаемых результатов.

Сообщение 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 результатов. Однако, если я определю термины наоборот, как ["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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»