-1

我正在做的是使用 Linq 查询数据库到实体以构建 xml 文档。在我使用带有“for xml”子句的存储过程和使用 xmlreader 之前,但现在我试图坚持只使用一种模型来查询数据库,Linq to Entities。

现在下面的代码是我能提供的最好的代码,但我真的很讨厌我找不到更好的解决方案来一次构建 XML,而不必先查询数据库,然后迭代创建 XElements。我无法直接在选择中创建 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)
          )));
4

1 回答 1

0

XElement 构造函数可以接受 IEnumerable,所以我只需将查询作为参数放入。北风数据库产品表的示例,它也应该适用于更复杂的查询。

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())
             )
         )
    );
于 2012-05-24T13:53:51.007 回答