【问题标题】:LINQ query - exception thrown if no match?LINQ 查询 - 如果不匹配则抛出异常?
【发布时间】:2017-03-31 04:46:59
【问题描述】:

考虑以下类:

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'。 但我需要能够在Where 子句中添加多个案例。 因此,另一个查询可能需要返回不同的状态,其中State = 'Texas' 和Dept = 'HR'。

总是只有一个字段是我需要区分的。

因此,我的第一个查询示例的结果将是“HR”和“DEV”,因为它们是具有“德克萨斯”作为州的不同部门。第二个查询的结果将是“3”和“5”,因为它们是不同的状态,其中州是“德克萨斯”,部门是“人力资源”。

更新:

这是我为查询 #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' 被抛出。 在 System.Linq.SystemCore_EnumerableDebugView`1.get_Items()

这是正常的 LINQ 行为吗?

【问题讨论】:

  • 不同不是条件,而是操作。如果您告诉我您想返回员工所属的每个部门的第一条记录,那就更有意义了。您需要重新表述您的问题,这也有助于提供一些演示数据以及您想要的输出。
  • 感谢您的评论。再次阅读我的问题,很明显我需要重新措辞。请使用示例数据查看我更新的问题。
  • 您在尝试在调试器中查看空枚举的内容时收到EnumerableDebugViewEmptyException —— 似乎很合理 :-) 尝试先将其转换为带有.ToList() 的列表。跨度>
  • 谢谢!只是出于好奇,先做.ToList(),然后再做.Distinct(),总是更安全吗?

标签: vb.net linq


【解决方案1】:

编辑后(新问题)。是的,这是“正常”(如:预期)行为。见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”或其他东西,但这可能只是无知。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复!我重新措辞了我的帖子,请查看更新,我想我现在遇到了一个完全不同的问题。
    【解决方案3】:

    创建您自己的比较器以检测项目是否相等

    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());
    

    【讨论】:

    • 感谢您的回复!我重新措辞了我的帖子,请查看更新,我想我现在遇到了一个完全不同的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多