Select 并使用 linq 对来自 2 个数据表的数据进行分组,并将结果显示在 datagridview 上

Select and group data from 2 datatables with linq and display the result on datagridview

我有 2 个 DataTable,其中包含有关员工和订单的数据。我需要获取与每个员工关联的订单数以及员工的 ID 和姓名。

这个SQL以我想要的格式显示数据:

select e.EmployeeID as ID, 
       (e.LName+' '+e.FName+' '+e.MName) as 'Full name', 
       COUNT(e.EmployeeID) as 'Sales number'
from Employees as e 
join Orders as o on e.EmployeeID=o.EmployeeID 
group by e.EmployeeID, e.FName, e.LName, e.MName

如何使用 LINQ 获取数据并在 dataGridView 中显示结果?

到目前为止,这是我的代码:

private void Form1_Load(object sender, EventArgs e)
{
    var empSales = from emp in Shop.ShopDB.Tables["Employees"].AsEnumerable()
                   join order in Shop.ShopDB.Tables["Orders"].AsEnumerable()
                   on emp.Field<int>("EmployeeID") equals order.Field<int>("EmployeeID")
                   group emp by emp.Field<int>("EmployeeID");

    IEnumerable<DataRow> DataRows = empSales.SelectMany(group => group);
    List<object[]> list= DataRows.Select(dr => dr.ItemArray).ToList();

    //trying to get the final object but group's key is not available
    //because these datarows don't have that field
    var empss = DataRows.Select(d => new 
    {
       ID = d.Field<int>("EmployeeID"),
       Фамилия = d.Field<int>("Lname"),
       Имя = d.Field<int>("Fname"),
       Отчество = d.Field<int>("Mname")

    });

    EmployeesSalesGridView.DataSource = list;
}

这是一个包含一些示例数据的脚本:

create table Orders (OrderID int, CustomerNo int, OrderDate datetime, EmployeeID int)
insert into Orders select 1, 1, '2009-12-28', 2
insert into Orders select 2, 3, '2010-09-01', 4
insert into Orders select 3, 4, '2010-09-18', 4
insert into Orders select 4, 1, '2010-12-10', 2

create table Employee (EmployeeID int, FName varchar(20), LName varchar(20), MName varchar(20))
insert into Employee select 1, 'Alpha', 'Bravo', 'Charlie'
insert into Employee select 2, 'Delta', 'Echo', 'Foxtrot'
insert into Employee select 3, 'Golf', 'Hotel', 'India'
insert into Employee select 4, 'Jacob', 'Kilo', 'Lima'

如果我对问题的理解正确,那么您希望结果包含以下列:EmployeeIDFullNameSalesNumber 并匹配 SQL 查询.

在您的代码中有注释:

//trying to get the final object but group's key is not available
//because these datarows don't have that field

您的 Linq 查询几乎是正确的。问题是您在使用 SelectMany 时将组展平,这就是您无法再访问组密钥的原因。这里不需要使用SelectMany

Select 将所需的数据放入匿名对象中,然后将其用作 GridView 的数据源:

var empSales = from emp in Shop.ShopDB.Tables["Employees"].AsEnumerable()
               join order in Shop.ShopDB.Tables["Orders"].AsEnumerable()
               on emp.Field<int>("EmployeeID") equals order.Field<int>("EmployeeID")
               group emp by emp.Field<int>("EmployeeID") into g
               select new 
               { 
                   EmployeeID = g.Key,
                   FullName = g.First().Field<string>("FName") + " " + 
                              g.First().Field<string>("MName") + " " + 
                              g.First().Field<string>("LName"),
                   SalesNumber = g.Count()
               };

EmployeesSalesGridView.DataSource = empSales.ToList();

这会产生与 SQL 示例数据查询相同的结果: