2012-05-24 40 views
-1

我在做什麼是用Linq查詢數據庫來創建XML文檔的實體。在我用「for xml」子句使用存儲過程並使用xmlreader之前,現在我試圖僅使用一個模型來查詢數據庫,Linq to Entities。Linq(到實體)到XElement的序列化(通過連接和分組)

現在下面的代碼是我可以用的最好的代碼,但我真的很討厭找不到更好的解決方案來一次構建XML,而無需先查詢數據庫,然後迭代創建XElements。 我無法直接在select中創建XElements,因爲該類沒有無參數的創建者,並且據我所知Linq中沒有ToXElement()。

以前做過類似事情的人對於如何做到這一點有更好的想法嗎?

var bus = from bs in db.mela_buddies_store 
       join mu in db.mela_users on bs.buddyId equals mu.userid 
       join mup in db.mela_users_picnames on mu.userid equals mup.userid into pics 
       from up in pics.DefaultIfEmpty() 
       join bc in db.mela_buddies_store on mu.userid equals bc.buddyId into cntr 
       from hm in cntr.DefaultIfEmpty() 
       where bs.userId == lu.guid 
       group bs by new 
       { 
       id = bs.ID, 
       displayname = mu.displayname, 
       gender = mu.gender, 
       picname = up.picname 
       } 
       into final 
       select new { 
       id = final.Key.id, 
       displayname = final.Key.displayname, 
       gender = final.Key.gender, 
       picname = final.Key.picname, 
       hm = final.Count() 
       }; 

    XElement xe = new XElement("buddies", 
     new XElement("userid", lu.userid), 
     bus.ToList().Select(bs => 
     new XElement("buddy", 
      new XElement("id", bs.id), 
      new XElement("displayname", bs.displayname), 
      new XElement("gender", bs.gender), 
      new XElement("picname", bs.picname), 
      new XElement("hm", bs.hm) 
     ))); 
+0

請參閱我對@xeondev的評論。 Linq to Entities(與Linq to SQL不同)不接受參數化構造函數(在select之後)。據我所理解。 –

回答

0

XElement構造函數可以接受IEnumerable,所以我只是簡單地將查詢作爲參數。 Northwind DB Products表格的示例,它也應該用於更復雜的查詢。

var xml = new XElement("products", 
    from prod in ctx.Products.ToList() 
    select new XElement("product", 
     new XElement("id", prod.ProductID), 
     new XElement("name", prod.ProductName) 
     ) 
    ); 

更新: 看來也可以加入分組了。我已經按供應商分組產品。

var xml = new XElement("suppliers", 
    (from prod in ctx.Products 
    join supp in ctx.Suppliers on prod.SupplierID equals supp.SupplierID 
    group prod by new { id = prod.SupplierID, name = supp.CompanyName }).ToList() 
    .Select(xe => new XElement("supplier", 
      new XElement("id", xe.Key.id), 
      new XElement("name", xe.Key.name), 
      new XElement("count", xe.Count()) 
      ) 
     ) 
    ); 
+0

Mhhh ...這正是我的第一次嘗試,但我得到了錯誤「沒有爲此對象定義的無參數構造函數」,實際上在linq實體中,我不認爲您可以在選擇之後放置任何參數化構造函數。或者我不理解什麼? –

+0

@MaxFavilli我只在LinqPad嘗試過,它的工作原理。但是對於EF,我得到了和你一樣的錯誤。 –

+0

@MaxFavilli在Entity Framework中,您必須在檢索後調用.ToList(),並且我的示例工作正常。 –