繁体   English   中英

使用LINQ和EF 4.1填充字典 <S,T> 具有相关实体数据的属性

[英]Using LINQ and EF 4.1 to populate a Dictionary<S,T> Property with related entity data

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

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

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

属性和地址表中的地址。 每个语言版本都将成为词典中的键。

像这样:

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

我知道我真的不能在对象初始化程序中进行.Add()调用,但是有没有办法使它起作用?

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

我不记得有没有下面的代码可以编译,但是您可以尝试执行以下操作:

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);

为了回应约翰对汉克的评论。

我写了字典扩展

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)
};

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM