2012-12-21 57 views
2

考慮下面的類:LINQ查詢 - 如果不匹配會引發異常?

Public Class Employee 
    Public State As String 
    Public Dept As String 
    Public Status as Integer 
End Class 

我需要從一個listEmployees這四個記錄查詢一個獨特的價值

oEmp = New Employee 
oEmp.Dept = "HR" 
oEmp.State = "Kansas" 
oEmp.Status = 1 
listEmployees.Add(oEmp) 

oEmp = New Employee 
oEmp.Dept = "HR" 
oEmp.State = "Texas" 
oEmp.Status= 3 
listEmployees.Add(oEmp) 

oEmp = New Employee 
oEmp.Dept = "HR" 
oEmp.State = "Texas" 
oEmp.Status= 5 
listEmployees.Add(oEmp) 

oEmp = New Employee 
oEmp.Dept = "DEV" 
oEmp.State = "Texas" 
oEmp.Status= 7 
listEmployees.Add(oEmp) 

我需要的查詢做的是返回不同的部門工作人員在那裏State ='德克薩斯州'。 但我需要能夠將多個案例添加到Where子句。因此,另一個查詢可能需要返回不同的狀態,其中State ='Texas',Dept ='HR'。

總是隻有一個我需要區分的字段。

因此,我的第一個查詢示例的結果將是「HR」和「DEV」,因爲這些是具有「德克薩斯州」作爲州的不同部門。第二個查詢的結果將是「3」和「5」,因爲這些是狀態爲「德州」而部門爲「HR」的不同狀態。

UPDATE:

這裏就是我有工作了查詢#1:

Dim test = (From emp As Employee In listEmployees 
      Where emp.State = "Texas" 
      Select emp.Dept).Distinct() 

但是,如果我指定的東西State不存在,如 「TTexas」 ,我得到以下例外(代碼不會炸燬,但如果我檢查此行執行後在Visual Studio中的變量test,我得到這個):

類型爲 的異常'System.Linq.SystemCore_EnumerableDebugViewEmptyException'被引發。 at System.Linq.SystemCore_EnumerableDebugView`1.get_Items()

這是正常的LINQ行爲嗎?

+1

區別不是它是一種操作的條件。如果您想告訴我,您想要返回員工所屬的每個部門的第一條記錄,這樣會更有意義。你需要改變你的問題,這也有助於提供一些演示數據和你想要的輸出。 – JamieSee

+0

感謝您的評論。通過再次閱讀我的問題很明顯,我需要重新說出它。請參閱我更新的問題和示例數據。 – lhan

+0

當你試圖在調試器中查看一個空的可枚舉的內容時,你會得到一個'EnumerableDebugViewEmptyException' - 看起來是合理的:-)嘗試先用'.ToList()'將它轉換爲一個列表。 –

回答

2

後您的編輯(新問題)。是的,這是「正常」(如在:有意的)行爲。見code of get_Items

public T[] Items 
{ 
    get 
    { 
     List<T> tempList = new List<T>(); 
     IEnumerator<T> currentEnumerator = this.enumerable.GetEnumerator(); 

     if (currentEnumerator != null) 
     { 
      for(count = 0; currentEnumerator.MoveNext(); count++) 
      { 
       tempList.Add(currentEnumerator.Current); 
      } 
     } 
     if (count == 0) 
     { 
      throw new SystemCore_EnumerableDebugViewEmptyException(); 
     } 
     cachedCollection = new T[this.count]; 
     tempList.CopyTo(cachedCollection, 0); 
     return cachedCollection; 
    } 
} 

我不知道爲什麼調試視圖應該拋出一個異常,而不是僅僅顯示「計數= 0」或什麼的,但是這可能只是無知。

0

不同的意思是橫跨行的所有元素。如果你有兩行所有返回的元素是相同的,distinct將把它減少到一行,但是如果即使一個元素不同,那麼兩行也將在不同之後被返回。當然,你可以覆蓋它(如here和Evgraf的答案)。 Grouping運營商更有可能是你正在尋找的(here是VB.net中的一個例子)。

+0

謝謝你的回覆!我重新寫了我的文章,請看更新,我認爲我現在有一個完全不同的問題。 – lhan

0

創建自己的比較器,以檢測物品的平等

public class Comparer : IEqualityComparer<Employee> 
{ 
    public bool Equals(Employee x, Employee y) 
    { 
     throw new NotImplementedException(); 
    } 

    public int GetHashCode(Employee obj) 
    { 
     throw new NotImplementedException(); 
    } 
} 

而且使用它

... .Distinct(new Comparer()); 
+0

謝謝你的回覆!我重新寫了我的文章,請看更新,我認爲我現在有一個完全不同的問題。 – lhan