2010-03-16 5 views
0

Je l'ai déjà posté auparavant, mais je l'ai mal formulé. J'essaye encore avec une structure plus réfléchie.Code de requête LINQ pour la fusion complexe de données

J'ai le code suivant et j'essaie de comprendre l'expression linq plus courte pour le faire 'inline'. Veuillez examiner la méthode "Run()" près du bas. J'essaie de comprendre comment joindre deux dictionnaires en fonction d'un identifiant correspondant dans l'un des objets - afin que je puisse utiliser la requête dans ce genre de syntaxe.

var selected = from a in items.List() 
       // etc. etc. 
       select a; 

pour que je puisse définir ma structure dans le code comme ...

TModelViewModel = new TModelViewModel 
{ 
TDictionary = from a in items... etc. etc... 
} 

au lieu de passer par un tas de boucles foreach, déclarations d'objets supplémentaires, etc.


C'est ma structure de classe. La méthode Run() est ce que j'essaie de simplifier. J'ai essentiellement besoin de faire cette conversion en ligne dans quelques endroits, et je voulais la simplifier beaucoup pour que je puisse la définir plus «proprement».

class TModel 
{ 
    public Guid Id { get; set; } 
} 
class TModels : List<TModel> 
{ 
} 
class TValue 
{ 
} 

class TStorage 
{ 
    public Dictionary<Guid, TValue> Items { get; set; } 
} 

class TArranged 
{ 
    public Dictionary<TModel, TValue> Items { get; set; } 
} 
static class Repository 
{ 
    static public TItem Single<TItem, TCollection>(Predicate<TItem> expression) 
    { 
     return default(TItem); // access logic. 
    } 
} 

class Sample 
{ 
    public void Run() 
    { 
     TStorage tStorage = new TStorage(); 
     // access tStorage logic here. 

     Dictionary<TModel, TValue> d = new Dictionary<TModel, TValue>(); 

     foreach (KeyValuePair<Guid, TValue> kv in tStorage.Items) 
     { 
      d.Add(Repository.Single<TModel, TModels>(m => m.Id == kv.Key),kv.Value); 
     } 
    } 
} 

Répondre

1

ont pas vraiment testé, et il est assez laid, mais je pense cela devrait fonctionner:

 Dictionary<TModel, TValue> d = new Dictionary<TModel, TValue>(); 

     d = d.Concat(tStorage 
      .Items 
      .Select(i => new KeyValuePair<TModel, TValue>(
       new TModel { Id = i.Key }, i.Value))).ToDictionary(i => i.Key, i => i.Value); 
+0

Hrnm. Cependant, je ne vois pas où il accède au référentiel d'éléments TModel. – Ciel

+0

Aha, je l'ai trouvé. Sur la troisième ligne, où Id = i.Key. Je définirais cela à une expression de prédicat identifiant la correspondance dans le référentiel. Ce code fonctionne parfaitement, merci beaucoup! Puis-je vous déranger pour expliquer un peu ce qui se passe? Je ne sais pas pourquoi cela fonctionne. – Ciel

Questions connexes