C# C MS Access查询返回字符串聚合

C# C MS Access查询返回字符串聚合,c#,string,C#,String,在我的数据库中,[Customer]和[Car]表之间存在一对多关系,其中一个客户可能拥有零辆或多辆汽车 我的项目要求我输出一个所有客户的列表,其中有一列显示车辆注册信息[VehicleReg]。如果客户有多辆车,则所有车辆登记必须以逗号分隔显示。如果客户没有汽车,则该列应为空 这是查询的基础,但我不知道如何返回注册号 选择[Customer].[FirstName],[CustomerLastName],在[Customer].[CustomerId]=[Car].[fkCustomerId]

在我的数据库中,[Customer]和[Car]表之间存在一对多关系,其中一个客户可能拥有零辆或多辆汽车

我的项目要求我输出一个所有客户的列表,其中有一列显示车辆注册信息[VehicleReg]。如果客户有多辆车,则所有车辆登记必须以逗号分隔显示。如果客户没有汽车,则该列应为空

这是查询的基础,但我不知道如何返回注册号

选择[Customer].[FirstName],[CustomerLastName],在[Customer].[CustomerId]=[Car].[fkCustomerId]上从[Customer]左侧加入[Car]以逗号分隔的车辆注册表

我想要的输出是这样的

FirstName   | LastName    | VehicleRegistrations
-------------------------------------------------
John        | Smith       | MY51 4RT
Joe         | Mason       | MU08 5TH
Connor      | Norman      |
Graham      | Naughton    | HT09 6TY, HT11 8UQ
Lilly       | Adams       | JK55 8HY
我使用的是MS Access 1997数据库、C和.NET 4.0

在现阶段,性能不是主要问题

到目前为止,我唯一可行的解决方案是将车辆登记保存到[Customer]表中的一列中。虽然这将起作用,但它将涉及手动保持新列与[Car]表中车辆登记的任何更改同步,这并不太困难,但一旦我将项目转交给其他人进行维护,这可能是一种危险的方法


非常感谢

为了实现这一点,您需要一个助手函数

公共函数JoinFromRecordset_ 数据源为字符串,可选分隔符为字符串=_ 可选列的长度=1作为字符串 Dim db作为DAO.Database,rs作为DAO.Recordset,s作为String,col作为Long Set db=CurrentDb 设置rs=db.OpenRecordsetDataSource,dbOpenForwardOnly 直到R.EOF为止 对于列=0到列-1 如果s=那么 s=Nzrscol 其他的 s=s&分隔符&Nzrscol 如果结束 下一列 下一个 环 rs.关闭:设置rs=无 db.Close:设置db=Nothing JoinFromRecordset=s 端函数 现在你可以写作了

选择FirstName、CustomerLastName、, JoinFromRecordset“从车辆中选择车辆如fkCustomerId=”和 客户ID作为车辆注册 来自客户
我会保持数据库不变,并在您的应用程序中运行报告操作,类似于我在下面所做的操作,使用Northwind数据库并将客户加入到订单中,订单Id取代您的注册号

创建两个类:

public class Customer
{
    public string Name { get; set; }
    public IEnumerable<Order> Orders { get; set; }
}

public class Order
{
    public int Id { get; set; }
}
为您的数据创建一个数据集,其中包含客户和订单的数据表以及外键上的表之间的关系。我使用类型化数据集自动创建适配器,但如果手动滚动,同样的原则也适用

创建一个ViewModel类,用于获取数据并对其进行排列

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SO_StringAggregate
{
    public class ViewModel
    {
        public ViewModel()
        {
            // populate the data set
            var dataSet = new NorthwindDataSet();
            using (var customersAdp = new NorthwindDataSetTableAdapters.CustomersTableAdapter())
            using (var ordersAdp = new NorthwindDataSetTableAdapters.OrdersTableAdapter())
            {
                customersAdp.Fill(dataSet.Customers);
                ordersAdp.Fill(dataSet.Orders);
            }

            // populate your domain objects
            var customers = dataSet.Customers.ToArray().Select(cust => new Customer
            {
                Name = cust.Company_Name,
                Orders = cust.GetOrdersRows().Select(order => new Order { Id = order.Order_ID })
            });

            this.Customers = customers;

            // build the report
            StringBuilder report = new StringBuilder();
            string formatString = "{0,-30}|{1}";

            report.Append(string.Format(formatString, "Name", "Order Ids"));
            report.Append(Environment.NewLine);
            Customers.ToList().ForEach(cust => report.AppendLine(string.Format(
                formatString, 
                cust.Name, 
                string.Join(",", cust.Orders.Select(o => o.Id).ToArray()))
                ));

            // display the report
            Report = report.ToString();
        }

        public IEnumerable<Customer> Customers { get; set; }

        public string Report { get; set; }

    }
}
然后,可以在绑定到报表属性的视图中显示数据

<Window x:Class="SO_StringAggregate.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBox FontFamily="Consolas" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Text="{Binding Report}" />
    </Grid>
</Window>

试试这个它会有帮助的,http://stackoverflow.com/a/1048235/405673@Furqan,TSQL在这种情况下可以工作吗mdb/.NET4?您在哪里输出这些数据?在win form应用程序上的datagridview上?@nicholas将数据加载到自定义实体列表中,并绑定到网格基础设施超链接。仅检查一下,用户打算从.NET应用程序运行select查询。这可能意味着函数是在mdb中定义的,表适配器能够调用自定义函数吗?对不起,我错过了。我的建议仅适用于Access应用程序;我在寻找一个比我写的DConcat函数更优雅的解决方案。我喜欢这给你的控制。它也可以用ADODB::Recordset::GetStrings编写。上面没有看到您的UltraWinGrid注释。在这种情况下,在Customer类上创建一个JoinedReg属性,该属性返回string.Join、、this.RegistrationNumber.ToArray