Я придумал этот пример, потому что это легко усваиваемая версия проблемы, которую я пытаюсь решить.Вот классы и их отношения.
Сначала у нас есть класс Country, который содержит объекты Dictionary of State, проиндексированные строкой (например, их имя или сокращение).Содержимое класса State не имеет значения:
class Country
{
Dictionary<string, State> states;
}
class State { ... }
У нас также есть класс Company, который содержит словарь из нуля или более объектов BranchOffice, также проиндексированных именами или сокращениями состояний.
class Company
{
Dictionary<string, BranchOffice> branches;
}
class BranchOffice { ... }
Экземплярами, с которыми мы работаем, являются один объект Country и массив объектов Company:
Country usa;
Company companies[];
Я хочу получить массив объектов State, содержащих ветвь.LINQ я написал ниже.Сначала он захватывает все компании, которые на самом деле содержат филиал, а затем присоединяется к списку состояний, сравнивая ключи обоих списков.
Проблема в том, что ToArray
возвращает анонимный тип.Я понимаю, почему анонимные типы нельзя привести к сильным типам.Я пытаюсь выяснить, могу ли я что-то изменить, чтобы получить строго типизированный массив.(И я открыт для предложений о лучших способах написания LINQ в целом.)
Я пробовал приводить к BranchOffice повсеместно (заранее, в list2, при окончательном выборе и других менеекандидаты).
BranchOffice[] offices =
(from cm in companies
where cm.branches.Count > 0
select new {
list2 =
(from br in cm.branches
join st in usa.states on br.Key equals st.Key
select st.Value
)
}
).ToArray();