2012-11-26 13 views
6

Ich versuche, verschiedene String-Werte aus einem Ax-Repository zu bekommen, aber ich habe viel identische Strings aus bekommen (Strings enthält nur Zahlen)Distinct Betreiber auf Liste <string>

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

Wo bin ich falsch machen?

+1

Was ist der Typ von BatchRouteId? – AlexH

+5

Ein Beispiel für die Daten wäre nett. –

+0

Ja BatchRouteId ist ein String – nk2003dec

Antwort

1

X ++ hat keinen eindeutigen Operator. Die verzögerte Ausführung wird versuchen, in ToList() auszuführen und wird daher fehlschlagen.

3

Haben Sie

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

Es funktioniert! Seltsam – nk2003dec

+3

Die Einhundert-Dollar-Frage lautet: Warum? –

+3

Dies benötigt eine kleine Erklärung, um eine Verbesserung von mir zu bekommen – RichK

3

versucht Wenn die BatchRouteId ein XElement, zum Beispiel war, dann würde wahrscheinlich ein Objektverweis Vergleich durchgeführt werden. In diesem Fall den Code ändern zu

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

UPDATE # 1

Beachten Sie, dass einige Arten implizite Konvertierungen implementieren, dass Sie denken, dass sie eine andere Art waren. Sie können einen string Parameter ohne expliziten Casting an einen Parameter übergeben, und der string wird automatisch in konvertiert.


UPDATE # 2

Nach einem Kommentar von nk2003dec Kontext ist LinqToDynamicsAx. Ich kenne diese Schnittstelle nicht, aber wahrscheinlich implementiert sie nicht Distinct. unter Verwendung der System.Linq.Enumerable.AsEnumerable<TSource> Erweiterungsmethode

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

ich auch invertiert Select und Where da dies vereinfacht den Zugriff auf BatchRouteId auf Objekt-LINQ, was Sie in einem solchen Fall kann, um den Kontext zu ändern, um eine XY-LINQ bilden