2016-06-29 3 views
0

У меня есть IQueryable и хочу записать его в словарь, в котором есть Foo как ключ, и подсчет этой коллекции Foo's Bars как значение.Слияние двух IQueryables в словарь с LINQ

public class Foo 
{ 
    public string ID { get; set; } 
    public ICollection<Bar> Bars { get; set; } 
} 

Так что результат будет выглядеть примерно так:

new Dictionary<Foo, int> 
{ 
    { someFoo, 2 }, 
    { anotherFoo, 6 }, 
    ... 
} 

И мне нужно, чтобы сделать это прямо из IQueryable, без Перебор реальных объектов. Чтобы было ясно, я не хотите сделать это:

// given some IQueryable<Foo> called 'foos' and some Dictionary<Foo, int> called 'dictionary' 
foreach (var foo in foos.ToList()) 
{ 
    dictionary.Add(foo, foo.Bars.Count()); 
} 

Вещи, которые я пробовал, не работает

МЕТОД 1

var dictionary = foos.ToDictionary(key => key, value => foos.Select(foo => foo.Bars.Count)); 

МЕТОД 2

var counts = foos.Select(foo => foo.Bars.Count); 

for (var i = 0; i < foos.Count(); i++) 
{ 
     dictionary.Add(foos.ElementAt(i), counts.ElementAt(i)); 
} 
+0

Невозможно избежать перечисления перечислимого, если вы хотите получить подсчет коллекции. –

+0

Я не понимаю вашего ограничения. Что вы подразумеваете под словом «не итерирование реальных объектов»? 'ToDictionary' итерации - вы не можете построить словарь без итерации, это не ленивый объект, такой как IQueryable. – Blorgbeard

ответ

1

Я уверен, что это w Уальд работы, вы пробовали это:

var dictionary = foos.ToDictionary(foo => foo, foo => foo.Bars.Count()); 
0

Ах, это в конечном итоге работает:

var result = from foo in foos 
      select new 
      { 
       Foo = foo, 
       Count = foo.Bars.Count() 
      }; 

Этот метод также имеет дополнительное преимущество, позволяя моей указать имена поля, что приятно для когда я сериализую этот объект в JSON.

+0

ОК. Не словарь, хотя .. – Blorgbeard

Смежные вопросы