实体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
,而我在模型所在的同一项目中运行了代码。
请帮我一下。
提前感谢。
建议使用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命令。希望这能有所帮助。