1

這裏有一堆我嘗試過的東西......希望你能從中推斷出我想要做什麼以及我在做什麼做錯了。好了,所以用這個DoQuery當我在與加載相關的實體問題:使用ObjectContext.CreateQuery(實體框架和存儲庫)加載相關實體(Eager Load)遇到麻煩

public ObjectQuery<E> DoQuery(ISpecification<E> where) 
    { 
     return (ObjectQuery<E>)_ctx.CreateQuery<E>("[" + typeof(E).Name + "]").Where(where.EvalPredicate); 
    } 

如果我只是用這個,我最終得到一個包含不同的是相關實體之外的所有合適的參數對象回來..即,如果其中一個是引用User表的UserID,那麼我也不會返回User對象。

我讀了,你可以做一個.INCLUDE(「用戶」)做實體的貪婪加載...但是當我嘗試這樣它不工作:

public ObjectQuery<E> DoQuery(ISpecification<E> where) 
{ 
    return (ObjectQuery<E>)_ctx.CreateQuery<E>("[" + typeof(E).Name + "]").Include("User").Where(where.EvalPredicate); 
} 

我也檢查以確保實體集名稱和型號名稱是「用戶」,他們是。我唯一能想到的其他事情是在("[" + typeof(E).Name + "]")中放置多個東西,但我不確定如何在其中包含多個實體...以下是我嘗試過的,因爲我看到有人說你可以通過放置多個實體來加載多個實體。插圖中。

public ObjectQuery<E> DoQuery(ISpecification<E> where) 
{ 
    return (ObjectQuery<E>)_ctx.CreateQuery<E>("[" + typeof(E).Name + "].[User]").Where(where.EvalPredicate); 
} 

但沒有奏效...

如果我不是在正確的軌道上,請讓我知道。有沒有人知道如何使用ObjectContext.CreateQuery加載相關的實體?任何建議或見解都有幫助。在評論中指出克雷格

謝謝
馬特

回答

1

這個答案的前一個轉不正確。既然我不能刪除這個答案(因爲評論?)我至少會試着留下一些沒有錯誤的東西。

假設您有一個包含兩個實體Product和ProductDetail的模型(.edmx)。進一步假設你想檢索給定的產品及其相關細節。

我會確保以下工作(因爲你有1有詳細記錄的ID的產品)

var result = ctx.CreateQuery<Product>("Products").Include("ProductDetails").Where(p => p.ProductId == 1); 

在上面的include語句,「產品詳細」是對產品的屬性。 如果這樣的作品,我會嘗試以下方法:

public ObjectQuery DoQuery<E>(Expression<Func<E, bool>> filter) 
{ 
    string entitySetName = GetEntitySetName(typeof(T)); 
    return (ObjectQuery<E>)_ctx.CreateQuery<E>(entitySetName).Include("ProductDetails").Where(filter); 
} 

注意GetEntitySetName()不是一個內置功能

var result = DoQuery<Product>(p => p.ProductId == 1); 
+0

我仍然沒有得到返回的用戶對象......我在這些行上放置了中斷,並檢查是否在那裏輸入了正確的entitySetNames。 – Matt 2009-10-31 20:15:42

+0

如果在調試可視化工具中展開查詢的「結果視圖」,則具有用戶屬性。當你展開時,你會得到一個用戶數量? – 2009-10-31 20:32:37

+0

不,它只是說 – Matt 2009-10-31 20:59:12

3

的createQuery需要一個ESQL語句。所以,你可以寫類似:

public ObjectQuery<E> DoQuery(ISpecification<E> where) 
{ 
    var esql = String.Concat(
     "SELECT VALUE e1 FROM OFTYPE(", 
     GetEntitySetName(typeof(E)), 
     ", ", 
     typeof(T).FullName, 
     ") AS e1"); 
    return Context.CreateQuery<T>(esql).Include("User").Where(where.EvalPredicate); 
} 

...其中GetEntitySetName是你寫這對你的實體類型返回字符串實體集名稱,或使用eager loading strategy的方法。

爲什麼OFTYPE?如果您的模型中存在繼承,則此ESQL將返回ObjectQuery<TParent>而不包含ObjectQuery<TChild>

最後,Include僅適用於實體E具有名爲User的屬性。類型和實體集名稱與Include無關。