我正在从书中学习实体框架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());
}
我的查询目的是获取所有联系人类型的对象,但不包括客户类型。 客户继承自联系
但是我收到了以下错误:
无法找到“BAModel.Customer”类型。确保所需的模式 加载并正确导入名称空间。近类型名称,第1行, 第64栏。
但是,如果我使用LINQ to Entities查询:
ObjectQuery<Contact> qry = context.Contacts.Where(c => !(c is Customer));
然后程序可以正常运行。
那么,为什么在Entity SQL BAModel.Customer
中找不到,而我在模型所在的同一个项目中运行代码。
请帮助我。
先谢谢。
答案 0 :(得分:0)
建议使用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类型。
答案 1 :(得分:0)
事实证明我使用了错误的命名空间。 正确的全名是BAGA.Customer而不是BAModel.Customer。 正确的名称空间是从Model(Model1.Designer.cs中的类的名称空间)生成的类的名称空间,而不是模型的名称空间。
答案 2 :(得分:0)
试试这个:
_ObjectContext.MetadataWorkspace.LoadFromAssembly(Assembly.GetAssembly(typeof(BAModel.Customer)));
在运行CreateQuery命令之前。 希望这有帮助。