2010-10-24 103 views
4

如果我有類似下面的類:實體框架4:如何將投影編碼到類類型?

public class Customer { 
    public int id {get;set;} 
    public string name {get;set;} 
    public string line1 {get;set;} 
    public string line2 {get;set;} 
    public string line3 {get;set;} 
    public string line4 {get;set;} 
} 

,我只想要選擇的ID和名稱值,保留其餘空。

var myCustomerList = DC.Customer.Select( 
        p => new Customer { id = p.id, name = p.name }); 

我得到以下錯誤:

The entity or complex type 'MyModel.Customer' cannot 
be constructed in a LINQ to Entities query. 

你會做怎麼回事呢?我是否需要指定所有類的字段?

+0

您是否找到解決問題的好方法? – Learner 2014-02-11 15:02:45

回答

2

試試這個:

var myCustomerList = from c in DC.Customer 
        select new { id = p.id, name = p.name }; 

以上將創建一個Anonymous Type

實際應用:

「VAR myCustomerList」 < - 匿名類型。

具有兩個屬性「id」和「name」的匿名類型。另外,「var」可以讓你創建一個隱式類型的局部變量。這意味着:

a)你不必聲明/寫一個類結構來保存只有這兩個屬性的類型;

b)您不必保持這一點 - 您可以更改上述查詢的結構,以及「它正常工作」。

+0

假設你想返回強類型的對象,其餘的字段爲空?我使用了你的建議,然後通過匿名對象循環提供一個新列表,所以我的存儲庫不需要定義大量的ViewModel類。 – 2010-10-24 01:34:13

+0

我循環記錄,因爲我不知道領域模型中會有多少個字段(如果他們添加更多的話)。 – 2010-10-24 01:35:33

0

另一種選擇是創建一個CustomerInfo類型:

public class CustomerInfo 
{ 
    public int Id { get; set;} 
    public string Name { get; set; } 
} 

不能兩種類型直接映射到EF同一個表,但是你可以很容易地創建一個視圖您的信息類型,然後映射到:

CREATE VIEW vwCustomerInfo AS SELECT Id, Name FROM Customer 

你那麼你CustomerInfo類型映射到你的觀點:

public class CustomerInfoMap : EntityConfiguration<CustomerInfo> 
{ 
    public CustomerInfoMap() 
    { 
    .ToTable("vwCustomerInfo"); 
    } 
} 

一個副作用這樣做的效果是,EF只會在查詢數據庫時檢索視圖中的列。當ID獲取CustomerInfo你會得到這樣的SQL:

SELECT Id, Name FROM vwCustomers WHERE id = 1

此外,只要您的視圖是可更新的,你可以從EF更新CustomerInfo類型和基礎表將被更新。