Использование LINQ и EF 4.1 для заполнения словаряСвойство со связанными данными объекта - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть таблица Customers, которая связана с другой таблицей Addresses. Таблица адресов имеет первичный ключ, состоящий из {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.

Ответы [ 3 ]

1 голос
/ 24 февраля 2012

Безопасный способ сделать это так:

Если 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);
1 голос
/ 24 февраля 2012

Я не помню по памяти, будет ли компилироваться следующий код, но вы можете попробовать что-то вроде этого:

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

Или вы можете попробовать следующее решение: Создание словаря из проекции LINQ

0 голосов
/ 24 февраля 2012

В ответ на комментарий Джона для Хенка.

Я написал расширение словаря

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

Для меня это работает. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...