1

本「Essential LINQ」から以下のプログラムを確認してください。

class Customer
    {
     public string CustomerID {get;set;}
     public string ContactName {get;set;}
     public string City {get;set;}
     public static List<Customer> GetCustomers()
     {
        return new List<Customer>
        {
            new Customer {CustomerID = "ALFKI", ContactName = "Maria Anders", City = "Berlin"},
            new Customer {CustomerID = "ANATR", ContactName = "Sns Trujillo", City = "Mexico D.F."},
            new Customer {CustomerID = "ANTON", ContactName = "Antonio Moreno", City = "Mexico D.F."}
        };
     }
    }
void Main()
{
    var query = from c in Customer.GetCustomers()
                where c.City == "Mexico D.F."
                select new { c.City,  c.ContactName};
    foreach (var cityandcontact in query)
    {
        Console.WriteLine(cityandcontact);
    }
}

LINQ クエリで、行から「new」を削除するとエラーが発生する理由:
select new {c.City, c.ContactName};

なぜこのように書けないのか

select c.City, c.ContactName;

ここでのロジックは何ですか?

4

6 に答える 6

4

クエリは、同じクラスのオブジェクトの列挙を返します。任意のクラスにすることができますが、すべての行に対して 1 つだけにする必要があります。オブジェクトのペア (都市名と連絡先名) を 1 つのオブジェクトに結合せずに返すことはできません。この場合、それらを 2 つのプロパティを持つ匿名型のオブジェクトに結合しています。

Select余談ですが、両方のプロパティが同じCustomerクラスに由来するため、メソッドを使用する利点はまったくありません。実際、次のように顧客オブジェクトを変更せずに返すよりも効率的ではありません。

var query = from c in Customer.GetCustomers()
            where c.City == "Mexico D.F.";
foreach (var c in query)
{
    Console.WriteLine("{0} {1}", c.City, c.ContactName);
}
于 2012-07-09T02:44:35.053 に答える
1

LINQ メソッドは、他の C# メソッドと同様に、1 つの値/オブジェクトのみを返すことができます。(魔法のように物事が行うことを行うために、前述の仮想構造に追加された構文サポートはありませんnew { .. }。)

これが、さまざまなフィールドが新しいオブジェクトに「ラップ」される理由です。これは、選択されたすべてのフィールドを表すメンバーを持つ単一の値/オブジェクトです。

(同様に、最終結果である anIEnumerable<..>も、シーケンス内に 0 個以上の要素を持つ1 つのnew { .. }値/オブジェクトです。この場合、各要素は上記で作成された新しいオブジェクトです。)

于 2012-07-09T02:45:28.263 に答える
0

new { c.City, c.ContactName};匿名型の C# 構文です。

于 2012-07-09T02:45:36.600 に答える
0

「select」は、City 変数と ContactNamr 変数で構成される Customer クラスを選択します。そのため、これらの変数を持つ新しいクラスを選択して提供する必要があります

于 2012-07-09T02:45:50.807 に答える
0

これは SQL ではなく、これは linq であり、構文は基本的に表示されているものです。

select new { c.City,  c.ContactName};

クエリの出力を、City と ContactName のみを含む型に制限します。

これは何のタイプですか?これは、コンパイラが作成する匿名型です。

次に、コードはクエリの結果 ( ) を反復処理し、IEnumerable<this_new_type>この新しい型の ToString() を書き込みます。

于 2012-07-09T02:48:13.333 に答える
0

select newは、新しい無名オブジェクトを作成しています。

「匿名型は、最初に型を明示的に定義しなくても、一連の読み取り専用プロパティを単一のオブジェクトにカプセル化する便利な方法を提供します」

select new {c.City, c.ContactName};

投影する具象クラスを作成することもできます。

つまり、 Blahというクラス:

class Blah
{
  public string City {get;set;}
  public string ContactName {get;set;}
}

... [rest of query]
select new Blah {c.City, c.ContactName};

「select c.City, c.ContactName;」に行けない理由 、言語構文がそれを処理するように設計されていないためです。

于 2012-07-09T02:51:21.497 に答える