Получив словарь:
var dict = GetNaleznosc(list.Select(k => k.Id).ToList());
Теперь вы можете эффективно искать десятичное значение Naleznosci
для данного клиента:
foreach (var k in list)
k.Naleznosci = dict[k.Id];
Теперь вы объединили значения в основной список. Вы это имеете в виду?
Кстати, в вашей функции, которая создает словарь, вы заставляете его принимать List<int>
, но тогда все, что вы делаете, это вызываете ToDictionary
для него, что требует только IEnumerable<int>
. Поэтому измените тип параметра на этот, и тогда вы сможете вызвать его:
var dict = GetNaleznosc(list.Select(k => k.Id));
Это удаляет вызов на ToList
, что позволяет избежать создания ненужной промежуточной копии всего списка идентификаторов. Вероятно, в этом случае не будет особой разницы, если вы работаете с базой данных, а затем создаете большой набор результатов в памяти, но, возможно, стоит помнить о других видах использования этих операций.
Кроме того, если снова обратиться к вспомогательной функции, то нет очевидного преимущества в построении набора результатов в словаре для списка идентификаторов, поскольку каждый из них обрабатывается независимо. Вы можете просто написать:
public decimal GetNaleznosc(int klientId)
{
return (from z in _zdarzenieRepository.List()
from c in z.Klient.Cennik
where z.TypZdarzenia == (int) TypyZdarzen.Sprzedaz && z.IdTowar == c.IdTowar && z.Sprzedaz.Data >= c.Od && (z.Sprzedaz.Data < c.Do || c.Do == null) && z.Klient.Id == klientId
select z.Ilosc*(z.Kwota > 0 ? z.Kwota : c.Cena)).Sum() ?? 0);
}
То есть предоставить функцию, которая обнаруживает только одно значение. Теперь вы можете напрямую построить правильный список:
public List<KlientViewModel> GetListOfKlientViewModel()
{
return _klientRepository.List().AsEnumerable().Select(k => new KlientViewModel
{
Id = k.Id,
Imie = k.Imie,
Nazwisko = k.Nazwisko,
Nazwa = k.Nazwa,
SposobPlatnosci = k.SposobPlatnosci,
Naleznosci = GetNaleznosc(k.Id)
}).ToList();
}