Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq从2个数据表中选择数据并将其分组,并在datagridview上显示结果_C#_Winforms_Linq_Ado.net - Fatal编程技术网

C# 使用linq从2个数据表中选择数据并将其分组,并在datagridview上显示结果

C# 使用linq从2个数据表中选择数据并将其分组,并在datagridview上显示结果,c#,winforms,linq,ado.net,C#,Winforms,Linq,Ado.net,我有两个数据表,其中包含有关员工和订单的数据。我需要获得与每个员工相关联的订单数量以及员工的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.Employe

我有两个数据表,其中包含有关员工和订单的数据。我需要获得与每个员工相关联的订单数量以及员工的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;
}

如果我正确理解了这个问题,那么您希望结果包含以下列:EmployeeID、FullName和SalesNumber,并与SQL查询的结果相匹配

在代码中有以下注释:

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

将所需数据选择到匿名对象中,然后将其用作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查询相同的结果:

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'

那么,你以前的尝试有什么问题?@haldo当我试图从IEnumerable组检索数据行时,我无法“获取其密钥,正如我所认为的,这是订单”编号。如果你修改了你的帖子,那么你所问的问题是明确的,并且问题信息不会隐藏在评论中,这会有所帮助。如果您从您的帖子中删除尽可能多的不需要的代码示例以使其更易于理解,这也会有所帮助。“我想这就是你被否决的原因。”罗伯普里斯特利谢谢你的建议。这是我在这里的第一篇帖子,虽然好多了,谢谢!这帮了大忙!但事实证明g.First没有FName、MName或LName属性,所以我不得不使用g.First.fieldname,结果非常好。多谢各位@我很高兴能帮上忙。。。我忘了为您的数据表翻译Linq的这一部分。
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();