C# 6 では、オブジェクトとコレクションの初期化方法にいくつかの優れた機能が追加されました。
たとえば、次のコードは C#6 で有効です。
void Main()
{
var ints = new[] { 1, 2, 3, 4, 5 };
var myClass = new MyClass
{
// IEnumerableExtensions.Add<T> is called.
Items = { ints }
};
Console.WriteLine(myClass.Items.Count());
}
class MyClass
{
public ICollection<int> Items { get;} = new List<int>();
}
public static class IEnumerableExtensions
{
public static void Add<T>(this ICollection<T> collection, IEnumerable<T> items)
{
var list = collection as List<T>;
if (list != null)
{
list.AddRange(items);
return;
}
foreach (var item in items)
{
collection.Add(item);
}
}
}
そのため、読み取り専用のコレクション プロパティを持つオブジェクトの初期化式を記述できるようになりました。
また、エンティティを組み立てる方法を EF に伝える必要がある場合もあります。
from name in names
join addr in infoSecEmailAddresses
on name.LegalEntityIsn equals addr.LegalEntityIsn into addresses
where legalEntityIsns.Contains(name.LegalEntityIsn)
select new LegalEntitySideInfoSecParameters
{
LegalEntityIsn = name.LegalEntityIsn,
LegalEntityName = name.FullNameNominative,
Emails = addresses.Select(
a => new Email
{
EmailAddress = a.Address,
RecipientPriority = a.RecipientPriority
}).ToList()
}
ここでEmails
、プロパティは書き込み可能である必要があります。しかし、上位のコードを使用すると、読み取り専用にして次のようにコードを書き直すことができます。
Emails = {
addresses.Select(
a => new Email
{
EmailAddress = a.Address,
RecipientPriority = a.RecipientPriority
})
}
実際には、これは後でクライアント上で変換された匿名型の DTO ( AsEnumerable()
) を必要なエンティティに導入することで実現できます。それでも、その機能を EF7 自体でサポートしたいと考えています。