2011-11-04 14 views
6

dire che ho 3 nomi dei clienti:Linq - Ordina per StartsWith poi Contiene

Microsoft 
Another customer also called Microsoft 
A third customer called Microsoft 

Ora, se interrogo i clienti come questo ...

var q = (from cust in db.Cust 
        where cust.Name.Contains("Microsoft") 
        orderby cust.Name ascending 
        select cust) 

... ottengo questo ordine:

A third customer called Microsoft 
Another customer also called Microsoft 
Microsoft 

quello che voglio è quello di ottenere Microsoft prima, sulla base del fatto che si inizia con "Microsoft".

Cambio Contiene al StartsWith ovviamente mi lascia con 1 risultato invece di 3.

questo potrebbe essere fatto in una singola query?

+0

Non penso, è quasi necessario utilizzare le interrogazioni full-text con la ponderazione. – Sam

+0

@Sam - Ho abbandonato la ricerca di testo completo. Mi ha dato un mal di testa quando si utilizza spazi bianchi nella ricerca. – Malako

risposta

14

Forse

var q = (from cust in db.Cust 
        where cust.Name.Contains("Microsoft") 
        orderby cust.Name.IndexOf("Microsoft"), 
          cust.Name.Length ascending 
        select cust) 
+0

Wow, è stato veloce! Elegante! – Malako

+0

Questa è un'ottima soluzione per il tuo problema. –

3

si poteva ordinare in base alla percentuale della partita.

orderby "Microsoft".Length * 1.0/cust.Name.Length 

Questo sarebbe resa 100% solo per Microsoft e molto meno per le altre partite.

+0

aMicrosoft ha lo stesso peso di MicrosoftB con tale approccio –

+0

Soluzione interessante. Tuttavia, è necessario aggiungere la discesa. Pollice su! – Malako

+0

@Valentine - Proprio così. Continuerò con la tua soluzione. – Malako