#c_sharp #oracle #entity_framework #expressions
Для доступа к БД Oracle из MVC ASP.Net приложения используется библиотека Oracle.ManagedDataAccess.EntityFramework 6.122.1.0 (это самая свежая версия библиотеки из NuGet на 14 ноября 2017) protected override Expression> getSelector() { return m => new { ID = m.ID, NAME = m.Name, LONGSTRING = "Bla-bla-bla-bla...some thousands characters..." + m.ID + "bla-bla...bla" }; } protected override ProblemMethod() { var result = db.MyEntity.Select(getSelector()).ToList(); } Проблема заключается в том, что в LONGSTRING собирается очень длинная строка (тысячи символов), и вызов Select выбрасывает исключение ORA-00932: inconsistent datatypes: "'expected CLOB got CHAR" Так уж строиться архитектура, что мне нужно получить именно Expression для вызова некоторых более сложных Select-ов в моём классе. Как побороть или обойти проблему? Как вариант обхода проблемы, можно заставить EF выполнить Select не в СУБД, а на клиенте. Но как это сделать? PS: Этот же вопрос на английском. Update Уместно было привести структуру MyEntity CREATE TABLE MyEntity (ID NUMBER(10), Name VARCHAR2(100));
Ответы
Ответ 1
Перевод https://stackoverflow.com/a/47226720/5574962 Если вы хотите выполнить Select на клиенте (т.е. загрузить все MyEntity и фильтровать затем на клиенте) var result = db.MyEntity.ToList().AsQueryable().Select(getSelector()).ToList(); Первый ToList() загрузит все сущности из базы данных. AsQueryable() позволит использовать Expression, в последующих методах.Ответ 2
Это известная проблема при работе с LOB'ами в EF. Ходят слухи, что она исправлена в последней версии Oracle.ManagedDataAccess.dll. Можешь обновить и попробовать. Также ты можешь вручную поправить код, заменив обращение к полю из выборки на явный вызов GetOracleClob.
Комментариев нет:
Отправить комментарий