1

我正在从书中学习 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));

然后程序可以正常运行。

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

请帮助我。

提前致谢。

4

3 回答 3

0

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

于 2011-06-09T04:31:56.623 回答
0

建议使用 anEntityCommand而不是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"]);
            }
        }
    }
}

这个类似的问题/答案是问题的根源:

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

于 2011-06-08T13:34:27.863 回答
0

尝试这个:

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

在运行 CreateQuery 命令之前。希望这可以帮助。

于 2011-10-24T02:21:40.657 回答