2010-02-17 11 views
2

Dire que j'ai une définition de méthode en tant que telle:'orderby' dans LINQ en utilisant un tableau de chaînes C#

public CustomerOrderData[] GetCustomerOrderData(string[] CustomerIDs) 
{ 
var query = (from a in db.Customer 
       join b in db.Order on a.CustomerID equals v.CustomerID 
       orderby CustomerIDs 
       select new CustomerOrderData() 
       { 
       //populate props here 
       }).ToArray(); 
} 

Mes CustomerIDs dans param d'entrée pourrait être { "1", "3", "400", » 200 "}

Je veux que mon tableau de retour soit ordonné de la manière ci-dessus. Y a-t-il un moyen facile de réaliser cela?

Ma solution était de le mettre dans un dictionnaire, puis de créer un nouveau tableau tout en bouclant ma collection CustomerIDs.

CustomerOrderData a une propriété nommée CustomerID

Répondre

5

Si vous matérialisent la requête, vous devriez être en mesure de trouver l'index de l'identifiant dans votre tableau et l'utiliser comme paramètre de commande. Montré ci-dessous en utilisant des méthodes d'extension.

var ordering = CustomerIDs.ToList(); 
var query = db.Customer.Join(db.Order, (a,b) => a.CustomerID == b.CustomerID) 
         .AsEnumerable() 
         .OrderBy(j => ordering.IndexOf(j.Customer.CustomerID)) 
         .Select(j => new CustomerOrderData { 
          // do selection 
         }) 
         .ToArray(); 
+0

tvanfosson: J'ai essayé votre méthode, le tableau retourné ne semble pas être sroted par ma chaîne CustomerIDs []. Semble que les données sont triées par ordre décroissant – ltech

+0

customerID est une chaîne dans la classe d'entité? Si ce n'est pas le cas, essayez de faire un IndexOf (j.Customer.CustomerID.ToString()) - ou changez votre tableau en un tableau de valeurs int (en supposant que c'est le type sur l'entité). – tvanfosson

0

Vous pouvez utiliser IndexOf:

orerby ContactIds.IndexOf(a.CustomerId) 

Notez que cela pourrait ne pas être aussi efficace pour les grands ensembles.

4

si les customerIds seront toujours les numéros puis convertion et l'ordre avant de l'utiliser dans ur requête

var orderedIds = CustomerIDs.Cast<int>().OrderBy(x => x); 
0

Vous pouvez créer une structure pour rechercher l'index souhaité à l'aide de customerid.

string[] CustomerIDs; 

Dictionary<string, int> customerIDOrdering = CustomerIds 
    .Select((c, i) => new (id = c.CustomerID, i = i}) 
    .ToDictionary(x => x.id, x => x.i); 

var query = from c in ... 
    orderby customerIDOrdering[c.CustomerID] 
    ... 
0

La clause de jointure préserve l'ordre de la séquence externe:

« l'opérateur de jointure conserve l'ordre des éléments de la séquence externe, et pour chaque élément extérieur, l'ordre des éléments de séquence interne correspondant. "

http://msdn.microsoft.com/en-us/library/bb394939.aspx

Vous ne devriez pas avoir à orderBy du tout:

from orderIndex in CustomerIDs 
join a in db.Customer on orderIndex equals a.CustomerID 
join b in db.Order on a.CustomerID equals v.CustomerID 
5

Je pense que cela résout le problème:

var orderedArray = YourCustomArray.OrderBy(s => s).ToArray();

+4

Le dépassement de pile n'encourage pas les réponses au code uniquement, en particulier celles qui interviennent après la question. Veuillez ajouter quelques commentaires expliquant votre code. – slugster

Questions connexes