实体SQL出现问题

本文关键字:问题 SQL 实体 | 更新日期: 2023-09-27 17:58:52

我正在学习书中的实体框架4。

我试着用实体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());
}

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

但我得到了以下错误:

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

但是,如果我用LINQ查询这样的实体:

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

则程序可以正确运行。

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

请帮我一下。

提前感谢。

实体SQL出现问题

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

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

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

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

试试这个:

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

然后运行CreateQuery命令。希望这能有所帮助。