网格中 linq 查询显示数据的问题

A problems with display data from linq queries in grid

我提出这个问题。 LinqSQl

         var query = from order in mydb.Orders
                    join customer in mydb.Customers on order.CustomerID    equals customer.CustomerID
                    join employee in mydb.Employees on order.EmployeeID equals employee.EmployeeID
                    join shipper in mydb.Shippers on order.ShipVia equals shipper.ShipperID
                    join orderdetail in mydb.Order_Details on order.OrderID equals orderdetail.OrderID
                    join product in mydb.Products on orderdetail.ProductID equals product.ProductID
                    select new
                                 {
                                     OrderID = order.OrderID,
                                     CustomerName = customer.CompanyName,
                                     EmployeeName = employee.FirstName,
                                     ShipperName = shipper.CompanyName,
                                     Products = product.ProductName,
                                     TotalPrice = orderdetail.UnitPrice * orderdetail.Quantity

                                 }
                        into d
                        group d by d.OrderID;

然后我想在数据网格中显示这些数据

这是我的标记:

              <%@ Page Title="Home Page" Language="C#"  AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="asp1._Default" %>
 <!DOCTYPE html>
  <html xmlns="http://www.w3.org/1999/xhtml">
 <head id="Head1" runat="server">
 </head>
  <body>
<form id="form1" runat="server">
<div>
     <asp:GridView ID="Grid" runat="server" AutoGenerateColumns="false"  
           CellPadding="4" ForeColor="#333333"  Width="600px">
        <Columns>
             <asp:BoundField DataField="OrderID" HeaderText="Name" />
             <asp:BoundField DataField="CustomerName" HeaderText="CustomerName" />
             <asp:BoundField DataField="EmployeeName" HeaderText="EmployeeName" />
             <asp:BoundField DataField="ShipperName" HeaderText="ShipperName" />
             <asp:BoundField DataField="Products" HeaderText="Products" />
             <asp:BoundField DataField="TotalPrice" HeaderText="TotalPrice" />
        </Columns>   
        <HeaderStyle BackColor="#7961da"  Font-Bold="True" ForeColor="White" />         
        <RowStyle BackColor="#F7F6F3"  ForeColor="#333333" />
      </asp:GridView>
</div>
</form>
</body>
 </html>

因此方法

         Grid.DataSource = query.ToList();
         Grid.DataBind();

我收到错误消息:在所选数据源上找不到名称为 'OrderID' 的字段或 属性。

我的问题是什么?

因为当我使用这个查询时

  var query1 = from order in mydb.Orders
                     join customer in mydb.Customers on order.CustomerID    equals customer.CustomerID
                     join employee in mydb.Employees on order.EmployeeID equals employee.EmployeeID
                     join shipper in mydb.Shippers on order.ShipVia equals shipper.ShipperID
                     join orderdetail in mydb.Order_Details on order.OrderID equals orderdetail.OrderID
                     join product in mydb.Products on orderdetail.ProductID equals product.ProductID

                     select new
                     {

                         OrderID = order.OrderID,
                         CustomerName = customer.CompanyName,
                         EmployeeName = employee.FirstName,
                         ShipperName = shipper.CompanyName,
                         Products = product.ProductName,
                         TotalPrice = orderdetail.UnitPrice * orderdetail.Quantity
                     };
                                 Grid.DataSource = query1;
                                 Grid.DataBind();

我显示数据,但它们没有分组。

我得到这个数据

订单号|客户名称|员工姓名 |发货人姓名 |产品展示|总价

1 苹果凯文 AIG Iphone 1000

1 苹果凯文 AIG IPAD 1100

2 三星约翰 KMP S6 900

2 三星约翰 KMP S5 800

我想得到这个结果。

订单号|客户名称|员工姓名 |发货人姓名 |产品 |总价

1 苹果凯文 AIG Iphone,Ipad 2100

2 三星 John KMP S6,s5 1700

当您在 LINQ 表达式中使用 group by 时,它会将结果类型从 IEnumerable<AnonType> 更改为 IEnumerable<IGrouping<int, AnonType>>,因为 OrderID 看起来是 int(请参阅 group byMSDN 上使用的方法的文档)。

因此您不能只显示为匿名类型的简单列表。

如果你想按 OrderId 排序结果,那么 group by 是浪费时间:使用 order by 排序。

如果要处理每个 OrderID 的所有对象,则需要分组。

编辑 基于修改后的问题:

在显示数据之前,您似乎想要按 OrderId 汇总运行,具体来说:

  • 总结TotalPrice
  • 用逗号分隔符加入 Prodcts

这很容易做到,但需要创建新实例。从上一个查询的 groupedData 开始:

var outputData = groupedData.Select(g => new {
                                      OrderId = g.Key,
                                      […]
                                      Products = String.Join(", ", g.Select(x => x.Products)),
                                      TotalPrice = g.Select(x => x.TotalPrice).Sum()
                                    });

group by 中的每个对象都是一个 IGrouping<int, AnonType>,它是一个 IEnumerable<AnonType> 加上一个额外的 Key 属性(它的分组依据);因此可以使用常用的 LINQ 运算符来执行聚合。