2010-04-28 8 views
0

-je obtenir des données sur les clients dans ma base de données avec cette méthode:Comment joindre les résultats de deux ensembles différents dans LINQ?

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; 
    } 

mais aussi j'ai une autre méthode qui compte la valeur pour le champ supplémentaire dans KlientViewModel - champ appelé « Naleznosci ».

J'ai une autre méthode qui compte la valeur de ce champ en fonction des ids clients, il ressemble à ceci:

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); 
} 

Donc ce que je veux faire est de joindre les données de méthode GetNaleznosc avec les données générées dans la méthode GetListOfKlientViewModel . J'appelle GetNaleznosc comme ceci:

GetNaleznosc(list.Select(k => k.Id).ToList()) 

mais je ne sais pas quoi faire ensuite.

+0

Je ne sais pas non plus si GetNaleznosc devrait retourner Dictionary ou peut-être que quelque chose d'autre est meilleur à cet effet. – Inez

+0

Comme il s'agit d'un site Web en anglais, cela nous aiderait si vous pouviez traduire le code en anglais. Au moins, dites-nous ce que GetNaleznosc signifie. –

+0

@Mark: GetNaleznosc signifie GetCredit - c'est par client, mais pour l'instant je ne le stocke pas dans un champ séparé dans DB (je ne veux pas) et je dois le calculer avec cette logique (à l'intérieur du GetNaleznosc) . Je pense que je peux utiliser ici linq rejoindre, mais je ne sais pas encore comment. – Inez

Répondre

0

Ayant obtenu le dictionnaire:

var dict = GetNaleznosc(list.Select(k => k.Id).ToList()); 

Vous pouvez maintenant rechercher efficacement la valeur décimale de Naleznosci pour un client donné:

foreach (var k in list) 
    k.Naleznosci = dict[k.Id]; 

Maintenant vous avez fusionné les valeurs dans la liste principale. C'est ce que tu veux dire? A propos, dans votre fonction qui construit le dictionnaire, vous lui faites accepter un List<int>, mais ensuite vous appelez ToDictionary, qui ne requiert que IEnumerable<int>. Donc, changer le type de paramètre à cela, et vous pouvez l'appeler:

var dict = GetNaleznosc(list.Select(k => k.Id)); 

Cela supprime l'appel à ToList, ce qui évite de faire une copie intermédiaire inutile de la liste complète des Ids. Probablement ne fera pas beaucoup de différence dans ce cas si vous frappez une base de données et ensuite accumuler un grand ensemble de résultats dans la mémoire, mais peut-être utile de garder à l'esprit pour d'autres utilisations de ces opérations. De plus, en regardant à nouveau la fonction d'assistance, il n'y a aucun avantage apparent à construire l'ensemble des résultats dans un dictionnaire pour une liste d'identifiants, car chacun est géré indépendamment. Vous pouvez simplement mettre:

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); 
} 

Autrement dit, fournissez une fonction qui ne reconnaît qu'une seule valeur. Maintenant, vous pouvez directement construire la bonne liste:

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(); 
} 
+0

Malheureusement, cette méthode ne fonctionne pas pour moi. Cela me donne: LINQ to Entities ne reconnaît pas la méthode 'System.Decimal GetNaleznosci (Int32)', et cette méthode ne peut pas être traduite en une expression de magasin. Notez que _klientRepository.List() renvoie le type IQueryable. – Inez

+0

Mais vous construisez les résultats en mémoire dans une 'Liste '.Par conséquent, vous pouvez simplement utiliser la méthode d'extension 'AsEnumerable' pour empêcher Linq d'exécuter du code dans le mauvais contexte; J'ai ajouté les modifications nécessaires à mon dernier extrait de code. –

Questions connexes