如何在LINQ中连接两个不同集合的结果?

时间:2010-04-28 22:11:21

标签: linq linq-to-entities

我使用此方法获取了有关数据库中客户的一些数据:

    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())

但不知道接下来该做什么。

1 个答案:

答案 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();
}