2011-06-08 46 views
1

我正在學習書中的實體框架4。實體SQL問題

我嘗試做一些查詢與實體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查詢到的實體是這樣的:

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

然後程序可以正常運行。

因此,爲什麼在實體SQL BAModel.Customer沒有找到,而我在模型所在的同一個項目中運行的代碼。

請幫我這個。

在此先感謝。

+1

不幸的是,比較一個EF查詢和你的adhoc SQL並不是一個好的比較。 EF查詢知道如何按照RDBMS的預期構建SQL查詢,而不會出現語法錯誤。 – 2011-06-08 14:01:58

+0

我只是爲了闡明該程序可以正確運行而進行比較。我只是困惑爲什麼與實體SQL EF無法找到該模型。 – adaapanya 2011-06-08 17:38:23

回答

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類型。

+0

不是類型是無效的實體SQL sintax。 – adaapanya 2011-06-08 14:18:27

+0

@ada:當你得到跟蹤字符串時發生了什麼。確認您使用的是Oracle? – 2011-06-08 15:02:37

+0

ToTraceString()之前發生異常,所以我沒有得到字符串。我使用SQL Server – adaapanya 2011-06-08 15:22:26

0

原來我使用了錯誤的名字空間。 正確的全名是BAGA.Customer而不是BAModel.Customer。 正確的命名空間是從Model(Model1.Designer.cs中的類的命名空間)生成的類的命名空間,而不是模型的命名空間。

0

試試這個:

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

運行的createQuery命令。 希望這有助於。