2010-12-21 58 views
3

我使用ADO.NET C#POCO實體生成器Visual Studio加載項爲我的實體生成POCO類。Linq使用生成的POCO類在EF4中的實體

當我嘗試使用類中的LINQ to Entities查詢,如下面的一個:

var q = from w in entities.Widgets 
     select new Widget 
     { 
      Id = w.Id, 
      WidgetName = w.WidgetName, 
      WidgetDescription = w.WidgetDescription 
     }; 


return q.ToList(); 

我得到以下異常:

「的實體或複雜類型MyNamespace.Widget」不能在LINQ to Entities查詢中構造「。

解決這個問題的唯一方法是使用匿名類型,然後另一個LINQ查詢:

var q = from w in entities.Widgets 
     select new 
     { 
      Id = w.Id, 
      WidgetName = w.WidgetName, 
      WidgetDescription = w.WidgetDescription 
     }; 

var r = from e in q.AsEnumerable() 
     select new Widget 
     { 
      Id = e.Id, 
      WidgetName = e.WidgetName, 
      WidgetDescription = e.WidgetDescription 
     }; 

return r.ToList(); 

這工作,但相當多餘。我明白爲什麼我會得到例外,但是有沒有更優雅的方法呢?

的POCO類由ADO.NET C#中產生的事實POCO實體發生器似乎不相關的問題;我嘗試使用我自己的POCO類,並看到相同的例外。

非常感謝。

編輯: 添加鏈接演練使用ADO.NET C#POCO實體發生器的Visual Studio插件 - http://blogs.msdn.com/b/adonet/archive/2010/01/25/walkthrough-poco-template-for-the-entity-framework.aspx

回答

4

我猜MyNamespace.Widget是一個自定義類 - 而不是EDM的一部分嗎?

如果是這樣,您不能將LINQ-Entities查詢投影到自定義類型中。如果您使用POCO或不是無關緊要。

你有正確的想法投射到匿名類型。

var widgets = entities 
       .Widgets 
       .ToList() // materialize query 
       .Select(x => new Widget 
         { 
          Id = w.Id, 
          WidgetName = w.WidgetName, 
          WidgetDescription = w.WidgetDescription 
         } 
       ).ToList(); 

這是比你更好的解決辦法了一下:

,一旦你有物化服務器上的查詢可以塑造客戶機上的查詢。

但是,這引出了一個問題 - 你爲什麼不擺在首位的EDM中返回的「小部件」型?

POCO's的重點在於,您可以將持久性邏輯分解爲簡單的類。所以我不知道爲什麼你從一個簡單的類型(POCO),另一個(看似相同)的簡單類型。您是否將您的POCO映射到DTO的N-Tier運輸?

+0

RPM1984,除了已經在EDM中創建的POCO外,我還沒有創建新的POCO。 ADO。NET C#POCO實體生成器加載項將實體從ModelName.Designer.cs中取出,併爲每個實體生成一個上下文類和一個單獨的POCO。它還從這些類中刪除了EdmEntityTypeAttribute屬性,我認爲它們有效地將它們從EDM中移除。 – 2010-12-22 04:07:52

2

page表明,這是因爲你的範圍之外創建一個實體對象實體框架,這顯然是不允許的。他們基本上使用與您相同的解決方法,通過在初始選擇後從匿名類型中雙擊選擇結果。

如果這是我,我可能會通過簡單地選擇w並完成它,或創建一個新的特殊的視圖類型類來適應Widget的特化,從而避免所有這些。我希望有一個更好的答案比這個:)