4

私はついに匿名型を理解し始めた初心者です。

(古い投稿を参照してください。匿名の linq クエリの選択の戻り値の型は何ですか? このデータを送り返す最良の方法は何ですか? )

LINQ クエリでは、linq クエリ内で必要な戻り値の型を形成しますよね? これを行う方法は匿名型ですよね?

代わりにTuple/Expandoオブジェクトを使用できるかどうか、いつ使用できるかを誰かに説明してもらえますか? それらはすべて非常に似ているように見えますか?

4

2 に答える 2

4

タプルと Expando オブジェクトは通常、LINQ では使用されません。どちらも匿名型とはかなり異なります。

匿名型は、一般的に LINQ クエリを "形成" するために使用されます。たとえば、string Nameプロパティとプロパティを持つ型を定義できますint Age

タプルは、「ペア」または「トリプレット」の種類の構造としてのみ機能する型です。たとえば、 aTuple<string, int>を定義できますが、プロパティの名前はItem1andItem2ではなくNameand となりAgeます。タプルは、これらのプロパティ名によってコードがわかりにくくなるため、通常、LINQ クエリの作成には使用されません。

ExpandoObject はまったく異なります。これにより、実行時に既存のオブジェクトにプロパティを追加できます。

于 2010-06-11T19:53:34.010 に答える
3

あなたは質問の文脈を述べていないので、LinqToObjects と LinqToSql の両方に答えます。

LinqToObjects で、List<Customer> source.

  //Straight projection.
  //no new instances are created when query is evaluated.
IEnumerable<Customer> result =
  from c in source where c.Name == "Bob"
  select c;

  //Different Type projection
  //a new instance of CustomerName is created
  // for each element in the result when the query is evaluated.
IEnumerable<CustomerName> result =
  from c in source where c.Name == "Bob"
  select new CustomerName() {Name = c.Name};

  //Anonymous Type Projection    
  //a new instance of an anonymous type is created
  // for each element in the result when the query is evaluated.
  //You don't have access to the type's name
  // since the compiler names the type,
  // so you must use var to talk about the type of the result.
var result =
  from c in source where c.Name == "Bob"
  select new {Name = "Bob"};

  //Tuple Projection (same as Different Type Projection)
  //a new instance of Tuple is created
  // for each element in the result when the query is evaluated.
IEnumerable<Tuple<string, int>> result = 
  from c in source where c.Name == "Bob"
  select new Tuple<string, int>(){First = c.Name, Second = c.Id};

LinqToSql で、IQueryable<Customer> db.Customers

  //Straight projection
  //when the query is resolved
  // DataContext.Translate<Customer> is called
  // which converts the private dbReader into new Customer instances.
IQueryable<Customer> result =
  from c in db.Customers where c.Name == "Bob"
  select c;

  //Different Type Projection
  //when the query is resolved
  // DataContext.Translate<CustomerName> is called
  // which converts the private dbReader into new CustomerName instances.
  // 0 Customer instances are created.
IQueryable<Customer> result =
  from c in db.Customers where c.Name == "Bob"
  select new CustomerName() {Name = c.Name};

  //Different Type Projection with a twist
  //when the query is resolved
  // DataContext.Translate<CustomerGroup> is called
  // which converts the private dbReader into new CustomerGroup instances.
  // 0 Customer instances are created.
  //the anonymous type is used in the query translation
  // yet no instances of the anonymous type are created.
IQueryable<Customer> result =
  from c in db.Customers
  group c by new {c.Name, TheCount = c.Orders.Count()} into g
  select new CustomerGroup()
  {
    Name = g.Key.Name,
    OrderCount = g.Key.TheCount,
    NumberInGroup = g.Count()
  };

わかりました、今は十分です。

于 2010-06-11T20:22:40.497 に答える