Будет ли EF7 поддерживать инициализаторы коллекций?
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.