2012-02-15 49 views
0

在我DAL我有retrievs數據庫記錄的EntityObject列表的數據訪問對象:枚舉的EntityObject項目清單具體EF對象的列表

private List<EntityObject> entities; 

var pList = context.Products.Where(...); 
entities = new List<EntityObject>(pList); 

要在我的BI層名單的工作我需要通過這個List<EntityObject>作爲Product對象的列表來鼓舞人心。我可以很容易地轉換回這樣的:

var pList = Data.Entities.Select(p => p as Product); 

,但不這樣創建List<EntityObject>的副本,此集合這將與大集合的擔憂倍增我的記憶足跡?

如果是這樣,有沒有辦法通過這List<EntityObject>作爲List<Product> enumarete而不是轉換爲Product而不是通過該副本枚舉?

+0

你能解釋一下你爲什麼不創建一個列表' '而不是?這似乎是一個更簡單的解決方案,並且接受一個'List 其中T:EntityObject'當前接受List '的任何地方都不是問題。 – hvd 2012-02-15 21:09:32

+0

因爲這個「通用」列表可以容納許多不同的EF對象,並且這種方式我只能處理我的基類中的一個List,而不是幾十個不同的特定EF對象的列表...... – 2012-02-15 21:14:18

+0

對我來說很難了解第一個'pList'和第二個'pList'之間的關係是什麼。什麼是'Data.Entities'?這與「實體」相同嗎? – svick 2012-02-15 21:16:33

回答

2

,但不這樣建立名單的這個集合,其將與 大集合的擔憂倍增我 內存佔用的副本?

沒有,這隻會令引用到實體的副本,所以這應該是不用擔心的。

另外一個更安全的方式做你的施法將是:

var pList = Data.Entities.OfType<Product>().ToList(); 

或者,你可以直接通過產品枚舉:

foreach(var product in Data.Entities.OfType<Product>()) 
{ 
    //.. 
} 
+0

在他的代碼中,他沒有調用「ToList()」,所以它甚至不會創建引用的複製。 – svick 2012-02-15 21:15:08

+0

是的,我希望是這種情況,但要確認,也是OfType 是一個更好的解決方案,所以+1和@svick和你選擇你的答案作爲答案,因爲使用OfType而不是as ...的好建議... – 2012-02-15 21:17:57

+0

@svick:是的 - 但OP在談論列表,所以我認爲他的意圖是創建另一個列表,儘管他的代碼示例沒有顯示 – BrokenGlass 2012-02-15 21:18:02

2

沒有,只是調用Select()(不帶ToList()new List()跟隨它)不會創建另一個List,所以你不必擔心內存佔用。它的功能是使用您提供的lambda計算Products的順序。如果lambda包含一些複雜的計算,並且您多次迭代結果,這可能會導致性能問題,但這不是這種情況。

還有,你可以用它來表達同樣的投兩種可選的方式,但他們有一些差異會發生什麼,當列表包含不Product的S對象:

  • Select(p => p as Product):你是我的唯一現在使用。如果序列包含的對象不是Product s,則它們將變爲null s。
  • OfType<Product>():非Products將被過濾掉。
  • Cast<Product>():如果該序列包含非Product s,則會引發異常。這可能是你想要的版本。
+0

感謝您的額外信息,它是非常有用的,但列表不能包含產品以外的其他對象(即使它可以,我希望他們在這種特定情況下過濾掉)所以鑄是不是真的是我想要的,OfType is ... – 2012-02-15 21:25:28