C# 当查询提供程序将ELINQ查询编译为ESQL时,类名是一个保留字

C# 当查询提供程序将ELINQ查询编译为ESQL时,类名是一个保留字,c#,sql-server-2008,entity-framework-4.1,reserved-words,entity-sql,C#,Sql Server 2008,Entity Framework 4.1,Reserved Words,Entity Sql,我收到这个错误: System.Data.DataException:初始化时发生异常 数据库。有关详细信息,请参阅InnerException。--> System.Data.EntitySqlException:“All”是保留关键字,无法删除 除非转义,否则不能用作别名。靠近第1行第1列。在 System.Data.Common.EntitySql.CqlLexer.MapUnescapedIdentifier(字符串 符号)在 System.Data.Common.EntitySql.C

我收到这个错误:

System.Data.DataException:初始化时发生异常 数据库。有关详细信息,请参阅InnerException。--> System.Data.EntitySqlException:“All”是保留关键字,无法删除 除非转义,否则不能用作别名。靠近第1行第1列。在 System.Data.Common.EntitySql.CqlLexer.MapUnescapedIdentifier(字符串 符号)在 System.Data.Common.EntitySql.CqlLexer.MapIdentifierWorkeyWord(字符串 symbol)位于System.Data.Common.EntitySql.CqlLexer.yylex()处 System.Data.Common.EntitySql.CqlParser.yylex()位于 System.Data.Common.EntitySql.CqlParser.yyparse()位于 System.Data.Common.EntitySql.CqlParser.Parse(字符串查询)位于 System.Data.Common.EntitySql.CqlQuery.Parse(String commandText, ParserOptions ParserOptions)位于 System.Data.Common.EntitySql.CqlQuery.CompileCommon(字符串 commandText、透视透视图、ParserOptions ParserOptions、, Func`3编译函数)位于 System.Data.Objects.EntitySqlQueryState.Parse()位于 System.Data.Objects.Elink.ExpressionConverter.TranslateInlineQueryOfT(ObjectQuery inlineQuery)在 System.Data.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter 父级,ConstantExpression linq)位于 System.Data.Objects.Elink.ExpressionConverter.TranslateExpression(表达式 林克)

在 System.Data.Entity.Infrastructure.DbQuery
1.System.Linq.IQueryable.get\u Provider()
在System.Linq.Queryable.Where(IQueryable
1源代码,表达式'1 谓词)在All.cs中的MyNamespace.All.GetEmptyList()处: 第35行

这似乎是由测试类的名称为“All”引起的

[TestClass]
public class All : Service
{
    [TestMethod]
    public void GetEmptyList()
    {
        var actualList = MyItems.Where(item => item.Id < 0);
    }
}
我假设我的类名正在转换为ESQL类型,这将把它转换为保留字。但是,我无法(直接)控制这一点,因为ESQL和TSQL不是我关心的问题,我认为这个问题不应该出现,特别是我不知道除了重命名我的类(如果我将其更改为“All2”,一切都正常)之外,我还能做些什么

为什么表达式解析器(具体来说,可能是
ExpressionConverter.Convert()
TranslateInlineQueryOfT
)不能自动转义保留字

有没有办法解决这个问题?更改类名是一种黑客行为


(首先使用.NET 4、EF 4.1和MS SQL 2008 R2运行代码。)

实际上更改类名将极大地帮助理解

什么事

实体框架是通用的,它从哪里获得保留字列表,以及如何获得保留字列表。
如果有修复,我怀疑它将是一个属性,用于转义或映射用于后端的类名。无论如何,我都会这样做。

在更广泛的背景下,“一切”都很清楚,我只是把它忽略了。但是,我同意你的观点,因为有一个提供者(这里是System.Data.SqlClient),这可以实现功能。此外,默认情况下逃跑肯定能避免这些问题?这是ORMs的一个恼人的方面,它们不是存储不可知论者。将db备份更改为内存中的集合不会引发问题-这表明ESQL中的“UNION”语句本身不是问题,而是TSQL。不,它不是TSQL,如果您使用本机,它应该是[ALL],我意识到,ORM中的某些东西应该将所有内容包装到DBMS用来包装“对象”名称的任何东西中。在这里,将备份存储更改为内存不会有帮助。如果不是TSQL,那么在我看来,它应该自动处理(甚至可能是TSQL)。
public IQueryable<MyItem> MyItems
{
    get { return Set<MyItem>(); }
}