我有一个非常简单的代码段来测试如何使用“ 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不断提示错误消息框。
我在哪里弄错了以及如何解决?
答案 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);
}
答案 1 :(得分:1)
正如评论所说,您没有收到任何错误。当以您刚才的方式创建查询时,最终会得到Enumerable
,直到您真正想要检索其中的数据时,该值才被评估。
要强制其获取数据,您可以执行以下操作:
var myList = result.ToList();
这将强制对Enumerable
进行评估,然后在此行之后使用断点,您可以检查myList
变量并查看其中具有什么值。
关于您的Console.WriteLine(result);
行-这是行不通的,因为实际上发生的是WriteLine
实际上会在您的.ToString()
参数上调用result
。 ToString
的输出不是查询或列表的内容,而是对象类型的标准名称。 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}");
}