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 本身支持该功能。