类名是查询提供程序将 ELINQ 查询编译为 ESQL 时的保留字

发布于 2024-12-15 13:50:15 字数 2138 浏览 0 评论 0原文

我收到此错误:

System.Data.DataException:初始化时发生异常 数据库。有关详细信息,请参阅内部异常。 ---> System.Data.EntitySqlException:“All”是保留关键字,不能 用作别名,除非它被转义。靠近第 1 行第 1 列。位于 System.Data.Common.EntitySql.CqlLexer.MapUnescapedIdentifier(字符串 符号)在 System.Data.Common.EntitySql.CqlLexer.MapIdentifierOrKeyword(字符串 符号)位于 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(字符串commandText, ParserOptions 解析器选项)位于 System.Data.Common.EntitySql.CqlQuery.CompileCommon(字符串 commandText、Perspective 透视图、ParserOptions parserOptions、 Func`3 编译函数) at System.Data.Objects.EntitySqlQueryState.Parse() 在 System.Data.Objects.ELinq.ExpressionConverter.TranslateInlineQueryOfT(ObjectQuery 内联查询)位于 System.Data.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter 父级,ConstantExpression linq) at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(表达式 林克)

...<剪断>...

在 System.Data.Entity.Infrastruct.DbQuery1.System.Linq.IQueryable.get_Provider() 在 System.Linq.Queryable.Where(IQueryable1 源,表达式`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);
    }
}

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 运行代码优先。)

I'm receiving this error:

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.DbQuery1.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

which seems to be caused by the name of the test class being 'All'.

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

The MyItems property is a public property on the Service base class:

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

I presume that my class name is being converted into an ESQL type, which turns it into a reserved word. However, I have no (direct) control over that, and as the ESQL and TSQL is not my concern, I don't think this problem should bubble-up, especially as I don't see what I can do about it, apart from rename my class (if I change it to 'All2', everything works fine.)

Why doesn't the expression parser (whereever specifically, maybe ExpressionConverter.Convert() or TranslateInlineQueryOfT) automatically escape reserved words?

Is there a way way I can fix this problem? Changing the class name is a hack.

(Running code-first with .NET 4, EF 4.1, against MS SQL 2008 R2.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜中书 2024-12-22 13:50:15

实际上改变类名将会对理解有很大的帮助。

全部什么?

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

Actually changing the class name would be a huge aid to comprehensibility.

All what?

The entity framework is generic, where would it get a list of reserved words from and how.
If there is a fix I suspect it will be an attribute to either escape or map the class name for use in the back end. It's the way I'd do it anyway.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文