1

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

4

0 回答 0