none
クエリ式について RRS feed

  • 質問

  • using System;
    using System.Collections;
    using System.Linq;

    class MyConsole
    {
        public static void Main()
        {
            Country co = new Country("Australia");
            var query =
                from Country c in co
                select c;
        }
    }
    class Country
    {
        public Country(string name)
        {
            c_name = name;
        }
        public string c_name;
    }
    以上のようなソースコードを書くと
    「ソース型'Country'のクエリパターンの実装が見つかりませんでした。'Cast'が見つかりません。」
    というエラーが出ます。どこがおかしいのでしょうか?

    2009年7月28日 13:58

回答

  • クエリ式ってのは基本的に「いくつかある物の中からより分けたり並び替えたりして新しい「いくつかある物」を取り出す」というものです。
    co は「いくつかある物」ではなくただ一つの物なので、クエリ式を使う意味はなさそうです。

    ちなみに、「いくつかある物」は、LINQ To Objects の場合は IEnumerable<T> を実装しているオブジェクトです。
    • 回答としてマーク Pawopewo 2009年8月4日 14:04
    2009年7月28日 14:23
  • Visual Basic における LINQ の概要
    http://msdn.microsoft.com/ja-jp/library/bb763068.aspx
    LINQ クエリ式 (C# プログラミング ガイド)
    http://msdn.microsoft.com/ja-jp/library/bb397676.aspx

    <引用>
    LINQ を使用すると、SQL Server データベース、XML、インメモリ配列、インメモリ コレクション、ADO.NET データセットなど、LINQ をサポートするリモートまたはローカルのデータ ソースのデータを照会できます。

    ちなみに書かれているのはC#ですのでC#で説明します。

    var query =
                from Country c in co
                select c;

    この場合は、 co は 配列・コレクション・リストである必要があります。
    (正確に言うと IEnumerable インターフェイスまたは IEnumerable(Of T) インターフェイスをサポートしている必要があります。)

    たとえば、データベースで以下のようにすると、COUNTRYテーブル(複数の列の集合)からCOUNTRYテーブルの各要素(この場合はNAMEだけ)の配列のようなものを取得できます。
    SELECT * FROM COUNTRY

    Linq もこれと同じで以下のようにするとco(Countryの配列・コレクション・リスト)からforeachでCountryの配列・コレクション・リストの各要素を取得できます。
    Country[] co = new Country[] {new Country("Australia"),new Country("Japan")};
    var query =
        from Country c in co
        select c;
    foreach (var c in query)
    {
        Console.WriteLine(c.c_name);
    }
    

    もちろんただ取得するだけでは co を foreach しても同じなのでですが、Linqは条件で絞ったりやソートなどLinq特有の操作を行えます。

    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2009/12
    • 回答としてマーク Pawopewo 2009年8月4日 14:04
    2009年8月3日 14:33

すべての返信

  • クエリ式ってのは基本的に「いくつかある物の中からより分けたり並び替えたりして新しい「いくつかある物」を取り出す」というものです。
    co は「いくつかある物」ではなくただ一つの物なので、クエリ式を使う意味はなさそうです。

    ちなみに、「いくつかある物」は、LINQ To Objects の場合は IEnumerable<T> を実装しているオブジェクトです。
    • 回答としてマーク Pawopewo 2009年8月4日 14:04
    2009年7月28日 14:23
  • Visual Basic における LINQ の概要
    http://msdn.microsoft.com/ja-jp/library/bb763068.aspx
    LINQ クエリ式 (C# プログラミング ガイド)
    http://msdn.microsoft.com/ja-jp/library/bb397676.aspx

    <引用>
    LINQ を使用すると、SQL Server データベース、XML、インメモリ配列、インメモリ コレクション、ADO.NET データセットなど、LINQ をサポートするリモートまたはローカルのデータ ソースのデータを照会できます。

    ちなみに書かれているのはC#ですのでC#で説明します。

    var query =
                from Country c in co
                select c;

    この場合は、 co は 配列・コレクション・リストである必要があります。
    (正確に言うと IEnumerable インターフェイスまたは IEnumerable(Of T) インターフェイスをサポートしている必要があります。)

    たとえば、データベースで以下のようにすると、COUNTRYテーブル(複数の列の集合)からCOUNTRYテーブルの各要素(この場合はNAMEだけ)の配列のようなものを取得できます。
    SELECT * FROM COUNTRY

    Linq もこれと同じで以下のようにするとco(Countryの配列・コレクション・リスト)からforeachでCountryの配列・コレクション・リストの各要素を取得できます。
    Country[] co = new Country[] {new Country("Australia"),new Country("Japan")};
    var query =
        from Country c in co
        select c;
    foreach (var c in query)
    {
        Console.WriteLine(c.c_name);
    }
    

    もちろんただ取得するだけでは co を foreach しても同じなのでですが、Linqは条件で絞ったりやソートなどLinq特有の操作を行えます。

    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2009/12
    • 回答としてマーク Pawopewo 2009年8月4日 14:04
    2009年8月3日 14:33
  • ありがとうございました
    これからもよろしくお願いします

    2009年8月4日 14:04
  • ありがとうございました
    よくわかりました
    2009年8月4日 14:06