我收到此错误:类名是保留字时查询提供编译ELINQ查询ESQL
System.Data.DataException: An exception occurred while initializing the database. See the InnerException for details. ---> System.Data.EntitySqlException: 'All' is a reserved keyword and cannot be used as an alias, unless it is escaped. Near line 1, column 1. at System.Data.Common.EntitySql.CqlLexer.MapUnescapedIdentifier(String symbol) at System.Data.Common.EntitySql.CqlLexer.MapIdentifierOrKeyword(String symbol) at System.Data.Common.EntitySql.CqlLexer.yylex() at System.Data.Common.EntitySql.CqlParser.yylex() at System.Data.Common.EntitySql.CqlParser.yyparse() at System.Data.Common.EntitySql.CqlParser.Parse(String query) at System.Data.Common.EntitySql.CqlQuery.Parse(String commandText, ParserOptions parserOptions) at System.Data.Common.EntitySql.CqlQuery.CompileCommon(String commandText, Perspective perspective, ParserOptions parserOptions, Func`3 compilationFunction) at System.Data.Objects.EntitySqlQueryState.Parse() at System.Data.Objects.ELinq.ExpressionConverter.TranslateInlineQueryOfT(ObjectQuery inlineQuery) at System.Data.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter parent, ConstantExpression linq) at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
...< snip >...
at System.Data.Entity.Infrastructure.DbQuery
1.System.Linq.IQueryable.get_Provider() at System.Linq.Queryable.Where(IQueryable
1 source, Expression`1 predicate) at MyNamespace.All.GetEmptyList() in All.cs: line 35
这似乎是由测试类是“所有”的名字引起的。
[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。)
在更广阔的背景下,“全部”很清楚,我刚刚离开了它。然而,我明白你的观点,因为有一个提供者(这里是System.Data.SqlClient),它可以实现这个功能。此外,默认情况下转义会确保避免这些问题?这是ORM的烦人方面之一,它们不是存储不可知的。将db-backing更改为内存中的集合不会引发问题 - 这表明ESQL本身中的'UNION'语句不是问题,而是TSQL之一。 – nicodemus13
Nah它不是TSQL,如果你是原生的,它将是[ALL],ORM中的某些东西应该将所有东西都包装在DBMS用来包装'object'名称中 –
将后备存储更改为内存将无济于事在这里,我意识到。如果它不是TSQL,那么在我看来它应该被自动处理(甚至可能是TSQL)。 – nicodemus13