【问题标题】:Problem with Entity SQL实体 SQL 的问题
【发布时间】:2011-06-08 13:11:26
【问题描述】:

我正在从书中学习 Entity Framework 4。

我尝试使用 Entity SQL 进行一些查询,如下所示:

using (var context = new BAEntities())
{                
    string str = "SELECT VALUE c " +
                 "FROM BAEntities.Contacts " +
                 "AS c " +
                 "WHERE c IS NOT OF(BAModel.Customer)";

    ObjectQuery<Contact> qry = context.CreateQuery<Contact>(str);

    Console.WriteLine(qry.Count());
}

我的查询目的是获取所有联系人类型的对象,而不是客户类型的对象。 其中,Customer 继承自 Contact

但我收到以下错误:

找不到类型“BAModel.Customer”。确保所需的架构 已加载并且命名空间已正确导入。靠近类型名称,第 1 行, 第 64 列。

但是,如果我像这样使用 LINQ to Entities 进行查询:

ObjectQuery<Contact> qry = context.Contacts.Where(c => !(c is Customer));

这样程序就可以正常运行了。

那么,为什么在实体 SQL 中找不到 BAModel.Customer,而我在模型所在的同一个项目中运行代码。

请帮帮我。

提前致谢。

【问题讨论】:

  • 不幸的是,比较 EF 查询与您的即席 SQL 并不是一个好的比较。 EF 查询知道如何按照 RDBMS 的预期构造 SQL 查询,而不会出现语法错误。
  • 我把比较只是为了说明程序可以正常运行。我只是混淆了为什么使用 Entity SQL EF 找不到模型。

标签: c# entity-framework entity-sql


【解决方案1】:

建议使用EntityCommand 而不是ObjectContext.CreateQuery

试试这个:

using (EntityConnection conn = new EntityConnection("name=MyEntities"))
{
    string str = "SELECT VALUE c " +
                 "FROM BAEntities.Contacts " +
                 "AS c " +
                 "WHERE c IS NOT OF(BAModel.Customer)";
    using (EntityCommand cmd = new EntityCommand(str, conn))
    {                    
        using (var reader = cmd.ExecuteReader())
        {                        
            while (reader.Read())
            {
                Console.WriteLine(reader["c"]);
            }
        }
    }
}

这个similar question/answer 是问题的根源:

如果您的查询是使用 EntityCommand 执行的,则数据类型是 EDM 类型。如果使用 ObjectQuery 执行查询,则数据类型为 CLR 类型。

【讨论】:

  • IS NOT OF TYPE 是无效的实体 SQL 语法。
  • @ada:当你得到跟踪字符串时发生了什么。确认您使用的是 Oracle?
  • 在 ToTraceString() 之前发生异常,所以我没有得到字符串。我使用 SQL Server
  • 感谢您的帮助,我找到了解决方案。见我的回答。但是,再次感谢。
【解决方案2】:

原来我使用了错误的命名空间。 正确的全名是 BAGA.Customer 而不是 BAModel.Customer。 正确的命名空间是从 Model 生成的类的命名空间(Model1.Designer.cs 中类的命名空间),而不是 Model 的命名空间。

【讨论】:

    【解决方案3】:

    试试这个:

    _ObjectContext.MetadataWorkspace.LoadFromAssembly(Assembly.GetAssembly(typeof(BAModel.Customer)));
    

    在运行 CreateQuery 命令之前。 希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多