如何:使用 LINQ 对数据进行计数、求和与求平均值计算 (Visual Basic)

使用语言集成查询 (LINQ) 可以轻松访问数据库信息和执行查询。

以下示例演示如何创建一个对 SQL Server 数据库执行查询的新应用程序。 该示例使用 AggregateGroup By 子句对结果进行计数、求和与求平均。 有关详细信息,请参阅 Aggregate 子句Group By 子句

本主题中的示例使用 Northwind 示例数据库。 如果你的开发计算机上没有此数据库,可以从 Microsoft 下载中心进行下载。 有关说明,请参阅下载示例数据库

注意

以下说明中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。 这些元素取决于你所使用的 Visual Studio 版本和你所使用的设置。 有关详细信息,请参阅个性化设置 IDE

创建与数据库的连接

  1. 在 Visual Studio 的“视图”菜单中,单击“服务器资源管理器”/“数据库资源管理器”,打开“服务器资源管理器”/“数据库资源管理器”。

  2. 在“服务器资源管理器”/“数据库资源管理器”中右键单击“数据连接”,然后单击“添加连接”。

  3. 指定与 Northwind 示例数据库的有效连接。

添加包含 LINQ to SQL 文件的项目

  1. 在 Visual Studio 中的“文件”菜单上,指向“新建”,然后单击“项目”。 选择 Visual Basic“Windows 窗体应用程序”作为项目类型。

  2. “项目” 菜单上,单击 “添加新项”。 选择“LINQ to SQL 类”项模板。

  3. 命名文件 northwind.dbml。 单击“添加”。 将打开 northwind.dbml 文件的对象关系设计器(O/R 设计器)。

将要查询的表添加到 O/R 设计器

  1. 在“服务器资源管理器”/“数据库资源管理器”中,展开与 Northwind 数据库的连接。 展开 “表” 文件夹。

    如果关闭了 O/R 设计器,可通过双击先前添加的 northwind.dbml 文件来重新打开它。

  2. 单击“Customers”表并将其拖放到设计器的左侧窗格中。 单击“Orders”表并将其拖放到设计器的左侧窗格中。

    设计器将为项目创建新的 CustomerOrder 对象。 请注意,设计器会自动检测表之间的关系,并为相关对象创建子属性。 例如,IntelliSense 将显示 Customer 对象具有与该客户相关的所有订单的 Orders 属性。

  3. 保存更改并关闭设计器。

  4. 保存你的项目。

添加代码以查询数据库并显示结果

  1. 从“工具箱”中,将 DataGridView 控件拖放到项目的默认 Windows 窗体 (Form1) 中。

  2. 双击“Form1”,将代码添加到该窗体的 Load 事件。

  3. 将表添加到 O/R 设计器后,设计器将为项目添加一个 DataContext 对象。 此对象包含访问这些表以及访问每个表的各个对象和集合所需的代码。 项目的 DataContext 对象是根据 .dbml 文件的名称命名的。 对于此项目,DataContext 对象命名为 northwindDataContext

    可以在代码中创建 DataContext 的实例,并查询 O/R 设计器指定的表。

    将以下代码添加到 Load 事件,以查询作为 DataContext 的属性公开的表,并对结果进行计数、求和与求平均。 该示例使用 Aggregate 子句查询单个结果,并使用 Group By 子句显示已分组结果的平均值。

    Dim db As New northwindDataContext
    Dim msg = ""
    
    Dim londonCustomerCount = Aggregate cust In db.Customers
                              Where cust.City = "London"
                              Into Count()
    msg &= "Count of London Customers: " & londonCustomerCount & vbCrLf
    
    Dim averageOrderCount = Aggregate cust In db.Customers
                            Where cust.City = "London"
                            Into Average(cust.Orders.Count)
    msg &= "Average number of Orders per customer: " &
           averageOrderCount & vbCrLf
    
    Dim venezuelaTotalOrders = Aggregate cust In db.Customers
                               Where cust.Country = "Venezuela"
                               Into Sum(cust.Orders.Count)
    msg &= "Total number of orders from Customers in Venezuela: " &
           venezuelaTotalOrders & vbCrLf
    
    MsgBox(msg)
    
    Dim averageCustomersByCity = From cust In db.Customers
                                 Group By cust.City
                                 Into Average(cust.Orders.Count)
                                 Order By Average
    
    DataGridView1.DataSource = averageCustomersByCity
    
    'Another way to grab the count and sum
    
    londonCustomerCount = (From cust in db.Customers
                           Where cust.City = "London").Count()
    
    venezuelaTotalOrders = (From cust in db.Customers
                            Where cust.Country = "Venezuela"
                            Select cust.Orders).Sum()
    
  4. 按 F5 运行项目并查看结果。

另请参阅