2011-06-07 78 views
1

我有一個問題,這個LINQ NHibernate的查詢預先加載問題

var listeShopping = (from cart in session.Query<Cart>() 
    .Fetch(cart => cart.ItemShopping) 
    .ThenFetch(item => item.Manufacturer) 
    select cart.ItemShopping).ToList<ItemShopping>(); 

當我啓動它我有一個奇怪的錯誤:

Query specified join fetching, but the owner of the fetched association was 
not present in the select list [FromElement{explicit,not a collection join, 
fetch join,fetch non-lazy properties,classAlias=_1,role=,tableName= (...) 

我需要預先加載,怎麼能我避免了那個錯誤?如果可以提供幫助,我會提及我只使用內部連接表來使用購物車表。我只需要知道購物車中的ItemShopping。

問候

編輯

我修改了代碼,使其在英語可讀的。我糾正了錯誤。

編輯2

我發現方法,它似乎工作...有人可以檢查它,如果我沒有做錯誤?

 var list = (from item in session.Query<ItemShopping>() 
        .Fetch(item => item.Manufacturer) 
        from cart in item.Cart 
        select item).ToList<ItemShopping>(); 
+0

「select」中的「pan」定義在哪裏? – Variant 2011-06-07 09:14:20

+0

您正在查詢購物車,從潘選擇的東西,並試圖將其轉換爲項目購物列表...一些細節需要:) – Sly 2011-06-07 09:16:29

+0

我修改了代碼...對不起! – 2011-06-07 09:25:32

回答

0

我不認爲用Linq處理這種情況是不可能的。但它是與HQL:

var listeShopping = session.CreateQuery(@" 
    select item 
    from Cart cart 
    join cart.ItemShopping item 
    join fetch item.Manufacturer 
    ") 
    .List<ItemShopping>(); 

備註:渴望提取製造商這種方式不一定是最好的執行方法。請考慮在製造商類中使用batch-size

+0

爲什麼我應該使用批量大小而不是急切的加載?什麼是贊成和反對?我按要求簡化了,我有10個Fetch,而且我沒有足夠的體積來進行一些生產性能測試。 – 2011-06-07 13:15:45

+0

@PhilippeSohm:10取?你應該使用批量*和*緩存,而不是獲取。使用批量大小允許針對每個實體類型進行小型,高效的查詢,而使用多個讀取語句會創建成本更高的大型連接。 – 2011-06-07 13:21:56

+0

Web應用程序緩存是否有效?如果我有一個像var items =(從會議(...)項目中選擇項目),然後一個foreach(項目中的var項目)var data = item.Manufacturer.Name。批量大小是否有效? – 2011-06-07 13:28:11