2012-11-26 18 views
6

Sto cercando di ottenere i valori di stringa distinti da un repository Ax, ma sto ricevendo un sacco di stringhe identiche fuori (stringhe contiene solo i numeri)operatore DISTINCT sulla lista <string>

var ret = context.XInventTransBackOrder 
    .Where(i => i.BatchRouteId != "") 
    .Select(i => i.BatchRouteId) 
    .Distinct() 
    .ToList(); 

Dove sono sta andando male?

+1

Qual è il tipo di BatchRouteId? – AlexH

+5

Un campione dei dati sarebbe carino. –

+0

Sì BatchRouteId è una stringa – nk2003dec

risposta

1

X ++ non ha un operatore distinto. L'esecuzione posticipata proverà ad eseguire su ToList() e fallirà a causa di ciò.

3

Hai provato

var ret = context.XInventTransBackOrder 
    .Where(i => i.BatchRouteId != "") 
    .Select(i => i.BatchRouteId) 
    .ToList(); 
ret = ret 
    .Distinct() 
    .ToList(); 
+0

Funziona! Weird – nk2003dec

+3

La domanda da cento dollari è: perché? –

+3

Ciò richiede una piccola spiegazione per ottenere un preventivo da me – RichK

3

Se il BatchRouteId era un XElement, per esempio, allora probabilmente un confronto riferimento a un oggetto verrebbe eseguita. In tal caso, modificare il codice per

var ret = context.XInventTransBackOrder 
    .Where(i => i.BatchRouteId != null && !String.IsNullOrEmpty(i.BatchRouteId.Value)) 
    .Select(i => i.BatchRouteId.Value) 
    .Distinct() 
    .ToList(); 

UPDATE # 1

Nota che alcuni tipi implementano conversioni implicite fa pensare che erano un altro tipo. È possibile passare un string a un parametro XName senza una trasmissione esplicita e lo string verrà convertito automaticamente in XName.


UPDATE # 2

Secondo un commento di nk2003dec contesto è LinqToDynamicsAx. Non conosco questa interfaccia ma probabilmente non implementa Distinct. Quello che si può in tal caso, è quello di cambiare il contesto formare un XY-LINQ to Object-LINQ utilizzando il metodo System.Linq.Enumerable.AsEnumerable<TSource> estensione

var ret = context.XInventTransBackOrder 
    .Select(i => i.BatchRouteId) 
    .Where(id => id != "") 
    .AsEnumerable() 
    .Distinct() 
    .ToList(); 

ho anche invertito Select e Where come questo semplifica l'accesso ai BatchRouteId

Problemi correlati