使用连接引发无法调试的异常

时间:2019-07-26 08:54:52

标签: c# linq exception join select

我有一个非常简单的代码段来测试如何使用“ join”将2个数据部分连接在一起,如下所示:

class Employee
{
    public string EmpName { get; set; }
    public int DeptId { get; set; }
}
class Department
{
    public int DeptId { get; set; }
    public string DeptName { get; set; }
}
class UseJoin
{
    public static void Test()
    {
        IEnumerable<Employee> employees = new[]
        {
            new Employee{ EmpName="John", DeptId=1 },
            new Employee{ EmpName="Kate", DeptId=2 },
            new Employee{ EmpName="Dave", DeptId=1 },
            new Employee{ EmpName="Dane", DeptId=3 },
            new Employee{ EmpName="Greg", DeptId=4 },
            new Employee{ EmpName="Tony", DeptId=4 },
        };

        IEnumerable<Department> departments = new[]
        {
            new Department{ DeptId = 1, DeptName = "math" },
            new Department{ DeptId = 3, DeptName = "physics" },
            new Department{ DeptId = 4, DeptName = "history" },
            new Department{ DeptId = 5, DeptName = "mandarine" },
        };

        var result = from e in employees
                     join d in departments
                     on e.DeptId equals d.DeptId
                     select new { e.EmpName, d.DeptName };
        Console.WriteLine(result);
    }
}

运行该程序后,控制台窗口将显示异常/错误,如下所示:

System.Linq.Enumerable+<JoinIterator>d__38`4[UseNullable.Employee,UseNullable.Department,System.Int32,<>f__AnonymousType0`2[System.String,System.String]]

我尝试调试,但是似乎无法直接调试此声明性linq,Visual Studio不断提示错误消息框。

我在哪里弄错了以及如何解决?

4 个答案:

答案 0 :(得分:1)

这将显示Linq表达式的结果。

var result = from e in employees
                join d in departments
                    on e.DeptId equals d.DeptId
                select new { e.EmpName, d.DeptName };

foreach (var item in result)
{
    Console.WriteLine(item.EmpName);
    Console.WriteLine(item.DeptName);
}

您还可以在调试器中展开“结果视图”并检查值enter image description here

答案 1 :(得分:1)

正如评论所说,您没有收到任何错误。当以您刚才的方式创建查询时,最终会得到Enumerable,直到您真正想要检索其中的数据时,该值才被评估。

要强制其获取数据,您可以执行以下操作:

var myList = result.ToList();

这将强制对Enumerable进行评估,然后在此行之后使用断点,您可以检查myList变量并查看其中具有什么值。

关于您的Console.WriteLine(result);行-这是行不通的,因为实际上发生的是WriteLine实际上会在您的.ToString()参数上调用resultToString的输出不是查询或列表的内容,而是对象类型的标准名称。 here上有更多关于ToString的信息。

要打印出查询的内容,您需要像这样进行提示:

foreach (var item in result)
{
    Console.WriteLine(item.EmpName + " - " + item.DeptName);
}

这将强制对您的Enumerable进行评估,并在新行中逐一打印您的员工和部门。

答案 2 :(得分:0)

您的结果类型为IEnumerable。您不能直接直接打印IEnumerable。您必须循环结果并显式打印对象。

答案 3 :(得分:0)

只需使用foreach即可输出结果。

foreach(var item in result) {
     Console.WriteLine($"Employee name: {item.EmpName}, Department name: {item.DeptName}");
}