私はついに匿名型を理解し始めた初心者です。
(古い投稿を参照してください。匿名の linq クエリの選択の戻り値の型は何ですか? このデータを送り返す最良の方法は何ですか? )
LINQ クエリでは、linq クエリ内で必要な戻り値の型を形成しますよね? これを行う方法は匿名型ですよね?
代わりにTuple/Expandoオブジェクトを使用できるかどうか、いつ使用できるかを誰かに説明してもらえますか? それらはすべて非常に似ているように見えますか?
私はついに匿名型を理解し始めた初心者です。
(古い投稿を参照してください。匿名の linq クエリの選択の戻り値の型は何ですか? このデータを送り返す最良の方法は何ですか? )
LINQ クエリでは、linq クエリ内で必要な戻り値の型を形成しますよね? これを行う方法は匿名型ですよね?
代わりにTuple/Expandoオブジェクトを使用できるかどうか、いつ使用できるかを誰かに説明してもらえますか? それらはすべて非常に似ているように見えますか?
タプルと Expando オブジェクトは通常、LINQ では使用されません。どちらも匿名型とはかなり異なります。
匿名型は、一般的に LINQ クエリを "形成" するために使用されます。たとえば、string Name
プロパティとプロパティを持つ型を定義できますint Age
。
タプルは、「ペア」または「トリプレット」の種類の構造としてのみ機能する型です。たとえば、 aTuple<string, int>
を定義できますが、プロパティの名前はItem1
andItem2
ではなくName
and となりAge
ます。タプルは、これらのプロパティ名によってコードがわかりにくくなるため、通常、LINQ クエリの作成には使用されません。
ExpandoObject はまったく異なります。これにより、実行時に既存のオブジェクトにプロパティを追加できます。
あなたは質問の文脈を述べていないので、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()
};
わかりました、今は十分です。