LINQ查询 - 如果不匹配则抛出异常?

时间:2012-12-21 18:46:57

标签: vb.net 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 ='Texas'的不同Deparments。 但我需要能够在Where子句中添加多个案例。因此,另一个查询可能需要返回不同的状态,其中State ='德克萨斯'和{{1} } ='HR'。

总会有一个我需要区别的字段。

因此,我的第一个查询示例的结果将是“HR”和“DEV”,因为这些是具有“Texas”作为状态的不同部门。第二个查询的结果将是“3”和“5”,因为这些是不同的状态,其中状态是“德克萨斯”,而部门是“HR”。

更新

以下是我为查询#1工作的内容:

Dept

但是,如果我为Dim test = (From emp As Employee In listEmployees Where emp.State = "Texas" Select emp.Dept).Distinct() 指定了一些不存在的内容,例如“TTexas”,我会收到以下异常(代码不会爆炸,但如果我检查State在此行执行后,Visual Studio中的变量,我得到了这个):

  

类型异常   抛出了'System.Linq.SystemCore_EnumerableDebugViewEmptyException'。   在System.Linq.SystemCore_EnumerableDebugView`1.get_Items()

这是正常的LINQ行为吗?

3 个答案:

答案 0 :(得分: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;
    }
}

我想知道为什么调试视图应该抛出异常并且不仅仅显示“count = 0”或者其他东西,但这可能只是无知。

答案 1 :(得分:0)

不同意味着跨行的所有元素。如果你有两行所有返回的元素都是相同的,则distinct会将它减少到一行,但即使一个元素不同,那么两行都会在不同之后返回。当然,您可以覆盖此(如here和Evgraf的答案)。 Grouping运算符更有可能是您正在寻找的(here是VB.net中的一个示例)。

答案 2 :(得分: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());