2014-09-04 59 views
0

比方說,我有一個名爲Client的實體和分表。 Client有一個外鍵 - CountryId連接到Countries表。具有鑑別器的項目列表

ClientA,ClientBClientC繼承自Client

我想列出我的系統中的所有客戶端(包括那些帶有空countryId的客戶端)以及他們的具體類型(鑑別器值)和國家名稱。

我的查詢看起來是這樣的:

from client in DbContext.Set<Client>() 
        from country in DbContext.Set<Country>().Where(x => x.Id == client.CountryId).DefaultIfEmpty() 
        where !(client is Salon)       
        select new 
        { 
         Id = client.Id, 
         Name = client.ClientName, 
         ClientClass = "TODO", 
         CountryName = country.CountryName 
        }; 

我的問題:我怎樣才能選擇鑑別價值?請注意代碼中的「TODO」,此處我卡住了。

謝謝!

+0

如果你只是想要的類型名稱將'client.GetType()。toString()方法'無法勝任的字符串? – Brandon 2014-09-04 15:46:21

+0

我的不好,錯過了「具體類型」的要求......在這種情況下'client.GetType()'? – Brandon 2014-09-04 15:47:07

+0

我已經嘗試過沒有成功。我得到:'System.NotSupportedException:LINQ to Entities不能識別方法'System.Type GetType()'方法,並且這個方法不能被轉換成存儲表達式' – ofirbt 2014-09-04 15:54:24

回答

0

鑑別器列由Code First內部使用,您不能從繼承映射的角度讀取/寫入其值。

得到decriminator你必須創建自定義的SQL查詢

context.Database.SqlQuery<T>("SELECT client.Id, client.ClientName, client.Discriminator, country.CountryName FROM Countries country LEFT JOIN Clients client ON country.Id = client.CountryId WHERE client.Discriminator <> 'salon'").ToList() 
+0

認真? LINQ沒有辦法獲得這個值?問題中的查詢被簡化了,所以我不會浪費你的時間。它實際上是一個非常大的LINQ查詢,所以現在我需要將它切換到本機SQL查詢?也許我最好讓另一個查詢得到鑑別器,就是這樣... – ofirbt 2014-09-07 11:45:35