от
Я пишу приложение C # в .Net Core v.2.2.300, которое использует Entity Framework и Devart.Data.Oracle для извлечения исходного кода из нашей базы данных Oracle с использованием таблицы SYS.DBA_SOURCE в базе данных, в которой хранится каждая строка кода базы данных. как отдельная запись. Цель состоит в том, чтобы мы провели некоторый автоматический анализ. Для этого я создал функцию GetSourceCode, которой передаются имя схемы, имя объекта и тип объекта (PACKAGE / FUNCTION и т. Д.). Эта функция использует Linq и фильтрует dba_source (OWNER, NAME, TYPE, LINE, TEXT) только для записей, в которых данный владелец, имя и тип соответствуют тем, которые указаны в параметрах функции. Тем не менее, этот запрос всегда ничего не возвращает при использовании параметров, даже если я проверил непосредственно с базой данных, что записи существуют и должны были быть получены. Если я жестко закодирую строковые значения в запросе, тогда он работает, но это сводит на нет цель использования функции. Пользователь базы данных, которым я пользуюсь, может подключиться к базе данных и имеет разрешение на просмотр рассматриваемой таблицы, поэтому это не проблема разрешения, но я считаю, что это как-то связано с преобразованием Linq в SQL. Жесткое кодирование строковых значений в сравнение предложения where работает для извлечения данных, но не для значений, переданных в качестве параметров, если только мы не копируем параметры (используя конструктор копирования строки) в предложении (копирование ничего не делает вне предложения where). После экспериментов с запросом я нашел способ заставить функцию работать, используя конструкторы копирования, но выполнение этого приводит к медленному запросу, занимающему минуты, чтобы получить исходный код одного скрипта, который мы не можем использовать из. Я полагаю, что именно это копирование строки при каждой проверке предложения where вызывает медленную работу программы. В основном я хотел бы знать, почему я вижу поведение, которое я вижу, а также то, как я могу изменить запрос linq, чтобы использовать аргументы функции, не создавая такого огромного замедления. Следующий исходный код не работает и всегда возвращает пустую строку, хотя я могу использовать эквивалентный sql непосредственно в моей базе данных с теми же параметрами и получить правильные результаты (исходный код указанного файла)
private string GetSourceCode(string name, string owner, string oracleType) {
var qry = DbaSource
                .Where((row) => (
                    row.Name.Equals(name)

Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.

...