Имя класса является зарезервированным словом, когда поставщик запросов компилирует запрос ELINQ в ESQL - PullRequest
1 голос
/ 16 ноября 2011

Я получаю эту ошибку:

System.Data.DataException: исключение произошло при инициализации базы данных.Смотрите InnerException для подробностей.---> System.Data.EntitySqlException: «Все» является зарезервированным ключевым словом и не может использоваться в качестве псевдонима, если его не экранировать.Рядом со строкой 1, столбец 1. в System.Data.Common.EntitySql.CqlLexer.MapUnescapedIdentifier (символ String) в System.Data.Common.EntitySql.CqlLexer.MapIdentifierOrKeyword (символ String) в System.Data.Common.EerqSl.yylex () в System.Data.Common.EntitySql.CqlParser.yylex () в System.Data.Common.EntitySql.CqlParser.yyparse () в System.Data.Common.EntitySql.CqlParser.Parse (строковый запрос) в системе.Data.Common.EntitySql.CqlQuery.Parse (String commandText, ParserOptions parserOptions) в System.Data.Common.EntitySql.CqlQuery.CompileCommon (String commandText, Перспективная перспектива, ParserOptions parserOptions, Функц.EntitySqlQueryState.Parse () в System.Data.Objects.ELinq.ExpressionConverter.TranslateInlineQueryOfT (ObjectQuery inlineQuery) в System.Data.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate, выражение для объекта Conject..ExpressionConverter.TranslateExpression(Выражение linq)

... ...

в источнике System.Data.Entity.Infrastructure.DbQuery 1.System.Linq.IQueryable.get_Provider() at System.Linq.Queryable.Where(IQueryable 1, предикат Expression`1) в MyNamespace.All.GetEmptyList () в All.cs: строка 35

, которая, как представляется, вызвана именем тестового класса 'All'.

[TestClass]
public class All : Service
{
    [TestMethod]
    public void GetEmptyList()
    {
        var actualList = MyItems.Where(item => item.Id < 0);
    }
}

MyItemsсвойство является открытым свойством базового класса Service:

public IQueryable<MyItem> MyItems
{
    get { return Set<MyItem>(); }
}

Я предполагаю, что имя моего класса преобразуется в тип ESQL, что превращает его в зарезервированное слово.Тем не менее, я не имею (прямого) контроля над этим, и, поскольку ESQL и TSQL не являются моей проблемой, я не думаю, что эта проблема должна всплывать, тем более, что я не вижу, что я могу с этим поделать, кромеот переименования моего класса (если я изменю его на 'All2', все будет работать нормально.)

Почему парсер выражений (где бы то ни было, может быть, ExpressionConverter.Convert() или TranslateInlineQueryOfT) автоматически не экранирует зарезервированные слова?

Есть ли способ, как я могу решить эту проблему?Изменение имени класса является хаком.

(Запуск кода в первую очередь в .NET 4, EF 4.1 против MS SQL 2008 R2.)

1 Ответ

0 голосов
/ 16 ноября 2011

На самом деле изменение имени класса будет огромным подспорьем для понимания.

Все что?

Структура сущности является общей, откуда она получит список зарезервированных слов и как. Если есть исправление, я подозреваю, что это будет атрибут, который будет экранировать или отображать имя класса для использования в бэкэнде. Так или иначе, я бы так и сделал.

...