2012-11-26 18 views
6

Próbuję uzyskać różne wartości ciągów z repozytorium Ax, ale dostaję wiele identycznych ciągów out (ciągi zawiera tylko cyfry)Wyraźny operator na liście <string>

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

Gdzie jestem idzie źle?

+1

Jaki jest typ BatchRouteId? – AlexH

+5

Próbka danych byłaby miła. –

+0

Tak BatchRouteId jest ciągiem – nk2003dec

Odpowiedz

1

X ++ nie ma odrębnego operatora. Odroczone wykonanie spróbuje wykonać na ToList() i z tego powodu nie powiedzie się.

3

Czy próbowałeś

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

Działa! Dziwne – nk2003dec

+3

Pytanie za sto dolarów brzmi: dlaczego? –

+3

To trzeba trochę wytłumaczyć, aby uzyskać ode mnie odwagę. – RichK

3

Jeśli BatchRouteId był XElement, na przykład, wtedy prawdopodobnie porównanie odwołanie do obiektu zostanie wykonana. W takim przypadku zmiany kodu do

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

Aktualizacja # 1

pamiętać, że niektóre rodzaje wdrożyć niejawne konwersje co myślisz były innego typu. Możesz przekazać parametr string do parametru XName bez jawnego przesyłania, a string zostanie automatycznie przekonwertowany na XName.


UPDATE # 2

Zgodnie z komentarzem nk2003dec kontekście jest LinqToDynamicsAx. Nie znam tego interfejsu, ale prawdopodobnie nie implementuje on Distinct. Co można w takiej sytuacji jest zmiana kontekstu tworzą XY-LINQ do obiektowego LINQ przy użyciu metody System.Linq.Enumerable.AsEnumerable<TSource> przedłużacza

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

ja również odwrócony Select i Where jak to ułatwia dostęp do BatchRouteId