2010-09-23 4 views
0

J'ai un problème avec les projections nHibernate. Je ne sais même pas si ce que j'essaye peut être fait mais si des experts de nHibernate peuvent m'aider, je serais reconnaissant. J'utilise les critères de nHibernate pour interroger une base de données et je renvoie le résultat projeté à un objet différent (aminci).NHibernate Projections Duplicates To List

-je obtenir une liste des retours comme

Id CompanyId Description 
1  1   Desc1 
1  2   Desc1 
1  3   Desc1 
2  1   Desc2 
2  3   Desc2 
3  1   Desc3 
3  2   Desc3 
3  3   Desc3 

lorsque j'utilise cet objet

int Id 
int CompanyId 
string Description 

Ce que je suis à la recherche est d'obtenir quelque chose comme

Id CompanyId Description 
1 [1, 2, 3] Description 
2 [1, 3] Description 
3 [1, 2, 3] Description 

De un objet comme celui-ci

int id 
List`<int`> companyId 
string description 

Le code actuel je ressemble à

result = session.CreateCriteria<Object>() 
      .Add(Restrictions.Eq("SiteId", 616)) 
      .SetProjection(Projections.Distinct(Projections.ProjectionList() 
      .Add(Projections.Property("Id"), "Id") 
      .Add(Projections.Property("CompanyId"), "CompanyId") 
      .Add(Projections.Property("Description"), "Description") 
      .SetResultTransformer(Transformers.AliasToBean<ObjectReduced>()).List<ObjectReduced>(); 

Je voudrais savoir s'il y a quelque chose ici que je peux faire pour y parvenir, ou même si cela est tout à fait fausse route et il y a quelque chose de mieux.

Répondre

1

Vous ne pouvez pas faire cela directement dans NHibernate. La meilleure façon d'y parvenir est d'obtenir le jeu de résultats comme vous le faites actuellement, puis de remplir l'objet réduit avec les CompanyIds. Quelque chose comme:

var temp = session.CreateCriteria<Object>() 
      .Add(Restrictions.Eq("SiteId", 616)) 
      .SetProjection(Projections.Distinct(Projections.ProjectionList() 
      .Add(Projections.Property("Id"), "Id") 
      .Add(Projections.Property("CompanyId"), "CompanyId") 
      .Add(Projections.Property("Description"), "Description") 
      .SetResultTransformer(Transformers.AliasToBean<ObjectReduced>()) 
      .List<ObjectReduced>(); 
var groups = temp.GroupBy(x => x.Id); 
var result = new List<ObjectReduced>(groups.Count()); 
foreach (var member in groups) 
{ 
    var first = member.First(); 
    var companyIds = member.Select(x => x.CompanyId); 
    foreach (var companyId in companyIds) 
    { 
     first.CompanyIds.Add(companyId); 
    } 
    result.Add(first); 
} 
return result; 

Il y a probablement un moyen LINQier de le faire, mais voilà comment je résolu un problème similaire.

+0

Merci, j'ai fini par récupérer une liste d'objets, puis mapper à ObjectReduced manuellement. J'ai utilisé votre code pour obtenir les groupes d'objets et ajouté quelques lignes de code pour le mappage. –