使用LINQ和EF 4.1来填充Dictionary<;S、 T>;具有相关实体数据的属性

本文关键字:gt 属性 数据 实体 EF 填充 Dictionary 使用 lt LINQ | 更新日期: 2023-09-27 18:25:35

我有一个链接到另一个表Addresses的表Customers。Addresses表的主键由{CustomerID,LanguageID}组成。

我想编写一个LINQ查询,实例化一个类型并填充它的

Dictionary<string, Address> Addresses {get;set;}

属性中的地址。每一个Langauge都将成为字典中的关键。

像这样:

from c in customers
from a in c.Addresses
select new DataContainer
{
  ID = c.CustomerId,
  ...
  Addresses.Add(a.LanguageId, a),
  ...
};

我知道我真的不能在对象初始值设定项中执行.Add()调用,但有办法做到这一点吗?

注意:我当然可以像往常一样创建类型,然后返回并明确填充Addresses属性。

使用LINQ和EF 4.1来填充Dictionary<;S、 T>;具有相关实体数据的属性

我不记得下面的代码是否会编译,但你可以尝试这样的方法:

from c in customers
from a in c.Addresses
select new DataContainer
{    
  Addresses = new Dictionary<string, Address> {{a.LanguageId, a}};
};

或者您可以尝试以下解决方案:从LINQ投影实例化字典

这样做的安全方法如下:

如果DataContainer看起来像这样:

public class DataContainer
{
    public string ID { get; set; }
    public Address Address { get; set; }
}

你可以这样做:

from c in customers
from a in c.Addresses
select new DataContainer
{
  ID = c.CustomerId,
  Address = a
};
var dic = new Dictionary<string, Address>();
foreach (var n in query)
{
  dic.Add(ID,a);
}

或者简称:

var dic = query.ToDictionary<DataContainer, string, Address>(n => n.ID, n => n.a);

回应约翰对henk的评论。

我写了一个字典扩展

public static Dictionary<T, K> Build<T, K>(this Dictionary<T, K> dictionary, T key, K value)
{
       dictionary[key] = value;
       return dictionary;
}

现在你可以做这样的事情:

from c in customers
from a in c.Addresses
select new DataContainer
{    
  Addresses = new Dictionary<string, Address>()
                                              .Build(a.LanguageId, a)
};

对我来说,它确实有效。:)