我使用此方法获取了有关数据库中客户的一些数据:
public List<KlientViewModel> GetListOfKlientViewModel()
{
List<KlientViewModel> list = _klientRepository.List().Select(k => new KlientViewModel
{
Id = k.Id,
Imie = k.Imie,
Nazwisko = k.Nazwisko,
Nazwa = k.Nazwa,
SposobPlatnosci = k.SposobPlatnosci,
}).ToList();
return list;
}
但我还有另一种方法可以计算KlientViewModel中额外字段的值 - 名为'Naleznosci'的字段。
我有另一种方法可以根据客户ID计算此字段的值,它看起来像这样:
public Dictionary<int, decimal> GetNaleznosc(List<int> klientIds)
{
return klientIds.ToDictionary(klientId => klientId, klientId => (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);
}
所以我想做的是将方法GetNaleznosc中的数据与方法GetListOfKlientViewModel中生成的数据相连接。我这样称呼GetNaleznosc:
GetNaleznosc(list.Select(k => k.Id).ToList())
但不知道接下来该做什么。
答案 0 :(得分:0)
获得字典:
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
的调用,这样可以避免对整个ID列表进行不必要的中间复制。如果您正在使用数据库然后在内存中构建大量结果,那么在这种情况下可能没有太大区别,但是对于这些操作的其他用途可能值得考虑。
另外,再看一下辅助函数,在字典中为id列表构建结果集没有明显的优势,因为每个函数都是独立处理的。你可以简单地说:
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();
}