2017-02-16 38 views
1

Je le code suivant:LINQ to Entities - trier par tableau

public List<OversizeElement> GetOversizeRegulations(List<string> states) 
    { 
     var tmpList = (from i in _db.States 
         where states.Any(p=>i.Name == p) 
         select new 
         { 
          StateID = i.ID, 
          StateName = i.Name, 
          StateShortName = i.ShortName 
         }).ToList(); 

, je sélectionner des informations supplémentaires pour tous les états de la variable «états de. Cela fonctionne, mais j'ai besoin d'obtenir le même ordre, comme dans la variable 'states'. Comment le trier? Elle exige objet IComparer, mais je ne peux pas imaginer comment écrire dans mon cas

+0

Comment est 'states' ordonné? –

+0

est l'ordre des états diffent puis tmplist? – lordkain

+0

@lordkain, différent –

Répondre

2

Si vous voulez la commande d'origine, vous pouvez faire quelque chose comme:

public List<Destination> GetOversizeRegulations(List<string> states) 
{ 

     var tmpDictionary = (from i in _db.States 
          where states.Contains(i.Name) 
          select new 
             { 
             StateID = i.Id, 
             StateName = i.Name, 
             StateShortName = i.ShartName 
             } 
          ).ToDictionary(k => k.StateName, k => k); 

     var result = states 
        .Where(m=>tmpDictionary.ContainsKey(m)) 
        .Select(m => tmpDictionary[m]).ToList(); 


} 
+0

D'où vient _db.Destinations'? –

+0

@MatiasCicero Désolé, ceci est votre Table (Etats) .Je ne l'ai pas compilé, je pense qu'il n'y a pas d'autres erreurs de syntaxe .. –

+0

@MatiasCicero Je viens d'ajouter le final Où dans l'état de cas n'existe pas dans la DB –

0

Énumérer states au lieu de _db.States:

var tmpList = states 
       .Select(s => _db.States.SingleOrDefault(st => st.Name == s)) 
       .Where(s => s != null) 
       .Select(new 
       { 
        StateID = s.ID, 
        StateName = s.Name, 
        StateShortName = s.ShortName 
       }); 
0

Vous pouvez utiliser la fonction IndexOf au sein de votre fonction OrderBy. En supposant que vous avez un champ id dans les deux listes qui sont identiques. Disons que dans ce cas que id est appelé StateId:

var tmpList = (from i in _db.States 
        where states.Any(p=>i.Name == p) 
        select new 
        { 
         StateID = i.ID, 
         StateName = i.Name, 
         StateShortName = i.ShortName 
        }).OrderBy(s => states.Select(x => x.StateId).IndexOf(s.StateId)).ToList();