EF Core 3.1.1 Предотвращение исключения «Типы данных text и varchar несовместимы в операторе равенства», как это делает LINQPad 6 - PullRequest
1 голос
/ 03 февраля 2020

Я пытаюсь запустить это выражение LINQ через Entity Framework Core 3.1.1.

 using (Text3Context text3Context = new Text3Context(_constringText3))
            {
                var aus = text3Context.Ausschreibungen.Where(a => a.InhaltKurzText.Contains(value)).Select(c => c.InhaltKurzText).ToList();
            }

К сожалению, оно вызывает исключение: «Однако типы данных text и varchar несовместимы в операторе равенства оператор» , когда я запускаю одно и то же выражение в LINQPad 6:

string value = "test";
var aus = Ausschreibungen.Where(a => a.InhaltKurzText.Contains(value)).Select(c => c.InhaltKurzText);
aus.Dump();

, оно отлично работает без ошибок.

sql -запросы немного отличаются, как вы можете видеть:

Linq / EF Core:

SELECT [a].[InhaltKurzText]
FROM [dbo].[Ausschreibungen] AS [a]
WHERE (@__value_0 = '''') OR (CHARINDEX(@__value_0, [a].[InhaltKurzText]) > 0)',N'@__value_0 text',@__value_0='test'

LINQPad:

SELECT [a].[InhaltKurzText]
FROM [Ausschreibungen] AS [a]
WHERE ((@__value_0 = N'''') AND @__value_0 IS NOT NULL) OR (CHARINDEX(@__value_0, [a].[InhaltKurzText]) > 0)',N'@__value_0 nvarchar(16)',@__value_0=N'test'

Как я могу обработать этот запрос так же, как LINQPad?

Тип данных "10h *" для "InhaltKurzText" - это "текст", что, однако, является причиной исключения, так как изменение типа sql, к сожалению, не вариант, а обходные пути "дороги" «Я хотел бы иметь возможность запускать его так же, как это делает LINQPad.

Версия зависимости Microsoft.Data. Sql .Client: 1.0.19.269.1.

Заранее спасибо

1 Ответ

0 голосов
/ 03 февраля 2020

Похоже, это вызвано некоторыми изменениями в инфраструктуре EF Core 3.x и / или провайдере SqlServer. LINQPad не имеет значения, потому что он просто делегирует запрос LINQ базовой структуре (очевидно, EF Core 2.x в вашем случае).

Согласно SqlServer документация , text тип данных устарел и представляет

данные не-Unicode переменной длины в кодовой странице сервера и с максимальной длиной строки 2 ^ 31-1 (2 147 483 647).

Таким образом, даже если тип базы данных text, вы можете отобразить его в EF Core как varchar(2^31-1)

modelBuilder.Entity<Ausschreibungen>().Property(e => e.InhaltKurzText)
    .IsUnicode(false)
    .HasMaxLength((1 << 31) - 1);

Интересно, что сгенерированный SQL точно такой же (согласно журналу EF Core) как тот, который сгенерирован из

modelBuilder.Entity<Ausschreibungen>().Property(e => e.InhaltKurzText)
    .HasColumnType("text");

, но работает успешно, в то время как последний генерирует рассматриваемое исключение времени выполнения.

...