-1

私がやっていることは、Linq を使用してデータベースをエンティティにクエリし、xml ドキュメントを作成することです。以前は "for xml" 句でストア プロシージャを使用し、xmlreader を使用していましたが、現在はデータベースのクエリに 1 つのモデル、Linq to Entities だけを使用しようとしています。

以下のコードは私が思いついた最高のものですが、最初にデータベースにクエリを実行してからXElementを作成するために反復することなく、XMLを一度に構築するためのより良いソリューションを見つけることができなかったのは本当に嫌いです. クラスにはパラメーターなしの作成者がいないため、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)
          )));
4

1 に答える 1

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) 
        )
    );

更新: join と group by もOKのようです。仕入先ごとに製品をグループ化しました。

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 に答える