实体SQL问题

时间:2011-06-08 13:11:26

标签: c# entity-framework entity-sql

我正在从书中学习实体框架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中找不到,而我在模型所在的同一个项目中运行代码。

请帮助我。

先谢谢。

3 个答案:

答案 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命令之前。 希望这有帮助。