読者です 読者をやめる 読者になる 読者になる

LINQでTracのチケット集計

LINQが面白そうなんだけど、まだ触ったことがないんですよね。

というわけで、C#でTracのチケット操作 - ZOETROPEの日記を題材にして、LINQで遊んでみました。

まず、Tracにアクセスするためのソースは、http://blog.bittercoder.com/default,date,2006-10-16.aspxをベースにしたもの(TicketControlLibrary.cs)を使います。

次に、http://www.xml-rpc.net/からxml-rpc.net.2.1.0.zipをダウンロードし、CookComputing.XmlRpcV2.dllを参照設定に追加します。


そして、これがTracのチケットを集計するコード。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TicketControlLibrary;

namespace LinqToTrac
{
    class Program
    {
        static void Main(string[] args)
        {

            TicketManager manager = new TicketControlLibrary.TicketManager();
            manager.Connect("http://localhost/trac/SampleProject/login/xmlrpc", "admin", "admin");

            int[] ticketlist = manager.FindTicketIndex(@"order=id");

            List<TicketInfo> table = new List<TicketInfo>();
            foreach (int id in ticketlist)
            {
                table.Add(manager.GetTicket(id));
            }

            var ret = from ticket in table
                      where ticket.Owner == "zoetrope"
                      where ticket.Status == "new"
                      select new
                      {
                          ID = ticket.TicketId,
                          Name = ticket.Summary
                      };

            foreach (var i in ret)
            {
                Console.WriteLine("id = " + i.ID + " name = " + i.Name);
            }
        }

    }
}

これで、Ownerが"zoetrope"で、Statusが"new"のチケットが取得できました。

だけど、チケットをいったん全部取得してから、集計してるのが格好悪いよな〜。

WhereとかSelectの拡張メソッドを自作して、Tracのクエリを発行するようにできればいいのかな。LINQ to Trac

でも、Whereの引数って関数だよね。関数から文字列に変換とかってどうやるんだろ。