0

拥有三个表(我正在尝试做的简化方法)我正在尝试使用动态列构建一个表。

布局应该是一个网格,显示每个所有者拥有哪些许可证。这是从我首先需要进行不同选择以获取表的标题列的表中检索的。

在此处输入图像描述

这是我检索表标题以获取动态列的方法

var tableHeader = (from l in Licenses
join lt in LicenseTypes on l.LicenseTypeId equals lt.ID
where l.Category == 1
select new 
{
    l.LicenseTypeId,
    lt.Name
}).Distinct().OrderBy (x =>x.Name )

在此处输入图像描述

我不太清楚将这个查询与我的 headerquery 一起使用来组成我的表的最佳选择是什么

var tableData = (from l in Licenses select l)

一种方法是迭代 tableData 并为每个不同的所有者构建数据行并让子查询检索诸如所有者名称之类的数据以呈现在网格中。然而,这将导致对数据库的一系列事务,所以我想知道这是否可以以更优雅的方式完成。

这是为我的示例生成数据的脚本:

if exists (select * from sysobjects where name = 'LicenseType') drop table LicenseType
if exists (select * from sysobjects where name = 'License') drop table License
if exists (select * from sysobjects where name = 'LicenseOwner') drop table LicenseOwner
go

create table LicenseType
(
    ID int not null primary key,
    Name nvarchar(30) not null
)

create table LicenseOwner
(
    ID int not null primary key,    
    Name nvarchar(30) not null
)

create table License
(
    ID int not null primary key,
    LicenseTypeId int null references LicenseType(ID),
    LicenseOwnerId int null references LicenseOwner(ID),
    Status nvarchar(30),
    Category int not null
)

insert LicenseType values (1, 'A001')
insert LicenseType values (2, 'A002')
insert LicenseType values (3, 'A003')
insert LicenseType values (4, 'A004')
insert LicenseType values (5, 'C001')
insert LicenseType values (6, 'X001')

insert LicenseOwner values (1, 'Owner 1')
insert LicenseOwner values (2, 'Owner 2')
insert LicenseOwner values (3, 'Owner 3')
insert LicenseOwner values (4, 'Owner 4')
insert LicenseOwner values (5, 'Owner 5')

insert License values (1, 1, 1, 'OK', 1)
insert License values (2, 2, 1, 'Invalid', 1)
insert License values (3, 3, 1, 'OK', 1)
insert License values (4, 6, 1, 'Pending', 1)
insert License values (5, 1, 1, 'OK', 1)
insert License values (6, 2, 1, 'OK', 1)
insert License values (7, 6, 1, 'Invalid', 1)
4

1 回答 1

1

如果您很高兴最终得到一个数据表,那么您可以执行以下操作。

var data = (from r in Licenses 
            where r.Category == 1
            select new 
            { 
                 Owner       = r.LicenseOwner.Name , 
                 LicenseType = r.LicenseType.Name,  
                 Status      = r.Status 
            }
            ).ToList();

这应该通过一次数据库查找来检索您需要的所有信息,并且可以在需要时进行过滤(如示例中仅选择类别 1)

然后,您可以使用 ToLookup 按所有者对所有(内存中的)记录进行分组,即

var lookup = data.ToLookup(r => r.Owner , 
                           r => new   
                              { 
                              License = r.LicenseType  , 
                              Status = r.Status
                              } 
                           ).OrderBy(r=>r.Key);

然后检索列名并从中构建数据表。

var columns = (from r in data 
                    orderby r.LicenseType 
                    select r.LicenseType
                  ).Distinct().ToList();

DataTable dt = new DataTable();
dt.Columns.Add("Owner");
foreach(var r in columns)
    dt.Columns.Add(r);

然后从查找中填充数据表

foreach(var r in lookup)
{
    DataRow dr = dt.NewRow();
    dr["Owner"]  = r.Key ;

    foreach(var column in columns)
        dr[column] = "";

    foreach(var entry in r)
        dr[entry.License] = entry.Status;
    dt.Rows.Add(dr);
}

如果您包含对 System.Data.DataSetExtensions 的引用,您可以使用 linq 查询生成的数据表,例如

 var owner1 = (from r in dt.AsEnumerable() 
                  where r.Field<string>("Owner") == "Owner 1"      
                  select r
              ).SingleOrDefault();
于 2012-11-28T19:58:01.013 回答