网格中 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 by
在 MSDN 上使用的方法的文档)。
因此您不能只显示为匿名类型的简单列表。
如果你想按 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 运算符来执行聚合。
我提出这个问题。 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 by
在 MSDN 上使用的方法的文档)。
因此您不能只显示为匿名类型的简单列表。
如果你想按 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 运算符来执行聚合。