2012-11-26 52 views
6

我試圖讓不同的字符串值出斧倉庫,但我得到了很多相同的字符串進行的(字符串僅包含數字)鮮明操作<string>

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

我在哪裏出錯了?

+1

什麼是BatchRouteId的類型? – AlexH

+5

數據樣本會很好。 –

+0

是BatchRouteId是一個字符串 – nk2003dec

回答

1

X ++不具有明顯的操作者。延遲執行將嘗試在ToList()上執行並因此失敗。

3

你試過

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

它的工作原理!奇怪的 – nk2003dec

+3

百元問題是:爲什麼? –

+3

這需要一點點的解釋獲得一個給予好評,從我 – RichK

3

如果BatchRouteIdXElement,例如,那麼很可能對象引用比較將被執行。在這種情況下,更改代碼以

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

更新#1

注意,某些類型的實現隱式轉換讓你覺得他們是另一種類型。你可以通過一個stringXName參數沒有明確的鑄造和string將自動轉換到XName


更新#2

根據nk2003dec上下文的評論是LinqToDynamicsAx。我不知道這個接口,但可能它不實現Distinct。你可以在這種情況下什麼,是要改變的背景下形成XY-LINQ使用System.Linq.Enumerable.AsEnumerable<TSource>擴展方法

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

我倒也SelectWhere到對象,LINQ,因爲這簡化了BatchRouteId

訪問