TOPシステム開発> 第3回:さまざまなデータソースへのアクセス (3/3)

次世代データアクセステクノロジー」

次世代データアクセステクノロジー

第3回:さまざまなデータソースへのアクセス

著者:マイクロソフト  小高 太郎

公開日:2008/1/22(火)

LINQ to Object

ここまでの説明では、LINQを主にリレーショナルデータベースに対して使用するものとして紹介してきた。しかしLINQは、その他のデータソースも同じように対象にすることが可能である。例えばLINQ to Objectはメモリ内部のコレクションオブジェクトに対するクエリーを行う機能を提供する。

リスト7のプログラムは、コレクションオブジェクトproductsに対して、LINQがクエリーを発行している例である。非常に簡単な例であるが、コレクションの抽出が簡潔に実装できていることを確認していただけると思う。

また、注目して欲しいのは、データベースアクセスと同じ構文で、メモリ内部のコレクションオブジェクトに対してクエリーを行っている点である。なおVisual Studio 2008で作成されたクラスは、あらかじめLINQを使用できる設定になっているため、LINQ to Object用に特別な設定は必要ない。

LINQ to Xml

次に、LINQを使用してXMLデータをクエリーする例を紹介しよう。XMLを検索する方法としては、XmlReaderまたはXmlWriter APIを使用することが一般的であるが、LINQを使用することで、リスト8〜9のように非常に効率よくコーディングすることができる。

応用例

ここから先の応用方法は開発者の方々の多彩なアイデアにお任せしたいと思うが、例えばリスト10のようなテキストファイルから特定の文字をGrepするサンプルなどはすぐに思いつくだろう。

リスト7:LINQ to Objectの例
public class Product
{
    public string Name { get; set; }
    public string Type { get; set; }
}

public static void Main(string[] args)
{
    List<Product> products = new Listt<Product>
                  {
                      new Product{Name="クッキー", Type="洋菓子"},
                      new Product{Name="チョコレート", Type="洋菓子"},
                      new Product{Name="ようかん", Type="和菓子"},
                      new Product{Name="だいふく", Type="和菓子"}
                 };
    var query = from p in products
              where p.Type == "洋菓子"
              orderby p.Name
              select p;

    foreach(Product p in query)
Console.WriteLine(p.Name);
}

s リスト8:データソースとなるXMLファイル(products.xml)
  t<?xml version="1.0" encoding="utf-8" ?>
- t<products>
   - t<product type="洋菓子">
        t<Name>クッキーt</Name>
    t</product>
   - t<product type="洋菓子">
        t<Name>チョコレートt</Name>
    t</product>
   - t<product type="和菓子">
        t<Name>ようかんt</Name>
    t</product>
   - t<product type="和菓子">
        t<Name>だいふくt</Name>
    t</product>
  t</products>

リスト9:LINQ to XMLの例
static void Main(string[] args)
{
    XDocument doc = XDocument.Load(@"C:\products.xml");
    var query =
                from p in doc.Descendants("product")
                where p.Attribute("type").Value == "洋菓子"
                orderby p.Element("Name").Value
                select new
                {
                     Name = p.Element("Name").Value
                };

    foreach(var q in query)
            Console.WriteLine(q.Name);
}

リスト10:LINQ to Objectを使用した応用例
public static void Main(string[] args)
{
    System.IO.StreamReader str= new System.IO.StreamReader(
@"C:\readme.txt", Encoding.GetEncoding("Shift_JIS"));
    string text = str.ReadToEnd();
    str.Close();

    Listt<string> lsttext = new Listt<string>(text.Split(new char[] { '\n' }));
    var ret= from t in lsttext
           where t.Contains("Grepしたい文字列")
           select t;

    foreach(var r in ret)
             Console.WriteLine(r);
}


次回は

以上、LINQがどのようなものであるかご理解いただくため、可能な限り簡単なサンプルを使って紹介を行ってきた。しかし、これらは多数あるLINQテクノロジーのほんの一端に過ぎない。

LINQは実に多くの応用が期待できる非常に懐の深いテクノロジーである。はじめて構文を見ると奇異に感じるかもしれないが、その構文やコンセプトに精通していただきぜひ開発に役立てて欲しい。

さて、次回はADO.NET Entity Frameworkによるデータアクセスの実装方法について解説していく。


前のページ  1  2  3


マイクロソフト株式会社 小高 太郎
著者プロフィール
マイクロソフト株式会社  小高 太郎
ERP パッケージ開発に携わり、プログラマーからスタート。Microsoft Universityの講師を兼務、その後、SE、PM、管理職の道に進むも、縁あって2007年3月よりデベロッパー エバンジェリストに転身、現在は開発者向けに様々な技術訴求を行うべく活動中。


INDEX
第3回:さまざまなデータソースへのアクセス
  LINQ to SQLにおける「追加」「更新」「削除」の操作とLINQ to Object
  遅延実行の注意点
LINQ to Object