c# - 使用 ASP.NET 使用数据表对数据进行分组

标签 c# asp.net .net linq datatable

我在对下表格式的数据进行分组并尝试按照第二种表格格式对数据进行分组时遇到问题

 legacy                   subid                               converted     licPart         count
Ent 100 EP Lic E-LTU    7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb  NL AC  CE E-LTU  LIC-CP-EN-100  100
Ent 100 EP Lic E-LTU    7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb  NL OB USR E-LTU  LIC-CP-EN-100  100
Ent 100 EP Lic E-LTU    7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb  NL OG EP E-LTU   LIC-CP-EN-100  100
Ent 100 EP Lic E-LTU    7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb  NL AC  CE E-LTU  LIC-CP-EN-100  100
Ent 100 EP Lic E-LTU    7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb  NL OB USR E-LTU  LIC-CP-EN-100  100
Ent 100 EP Lic E-LTU    7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb  NL OG EP E-LTU   LIC-CP-EN-100  100
Ent 1K EP Lic E-LTU     7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb  NL AC CE E-LTU   LIC-CP-EN-1K   1000
Ent 1K EP Lic E-LTU    7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb   NL OB USR E-LTU  LIC-CP-EN-1K   1000
Ent 1K EP Lic E-LTU    7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb   NL OG EP E-LTU    LIC-CP-EN-1K  1000 

我正在尝试获取如下所示的数据,以便进一步分配给中继器以显示信息

 Ent 100 EP Lic E-LTU   7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb  NL AC CE E-LTU  LIC-CP-EN-100    100
                                                            NL OB USR E-LTU
                                                            NL OG EP E-LTU

 Ent 100 EP Lic E-LTU                                       NL AC CE E-LTU  LIC-CP-EN-100    100
                                                            NL OB USR E-LTU
                                                            NL OG EP E-LTU

Ent 1K EP Lic E-LTU                                         NL AC CE E-LTU   LIC-CP-EN-1K    1000  
                                                            NL OB USR E-LTU
                                                            NL OG EP E-LTU

我在 rowdatabound 事件期间尝试使用 GridView ,它工作正常,但我无法使用中继器获得相同的结果。我确定我们需要在将数据分配给转发器之前对数据进行分组

但是我不确定如何像上面提到的那样对数据进行分组

这是我的转发器代码

<asp:Repeater ID="RepeaterEnterprise" runat="server" OnItemDataBound="ItemBound">
                            <HeaderTemplate>
                                <table>
                                    <tr>
                                        <th>Avaialable Endpoints
                                        </th>
                                        <th>Converted Endpoints
                                        </th>
                                    </tr>
                            </HeaderTemplate>
                            <ItemTemplate>
                                <tr>
                                <td>
                                <table>
                                <tr>
                                    <td>
                                        <asp:TextBox runat="server" ID="txtAvaialble" Text='<%#Eval("LicenseCount") %>' ReadOnly="true">
                                        </asp:TextBox>
                                    </td>
                                    <td>
                                        <asp:TextBox runat="server" ID="txtConverted" Text='' ReadOnly="true">
                                        </asp:TextBox>
                                    </td>
                                    <td>                                       
                                            <tr>
                                                <td>
                                                    <asp:Label ID="lblcount" runat="server" Text='<%# Eval("Converted") %>'></asp:Label>
                                                </td>
                                                <td>25*
                                                </td>
                                            </tr>
                                        </table>
                                        <table>
                                            <tr>
                                                <td>
                                                    <asp:TextBox runat="server" ID="txtEndpoints" Text=''>
                                                    </asp:TextBox>
                                                </td>
                                                <td>
                                                    <asp:TextBox runat="server" ID="txtTotalEndPoints" Text='' ReadOnly="true">
                                                    </asp:TextBox>
                                                </td>
                                            </tr>
                                        </table>
                                    </td>
                                </tr>

                            </ItemTemplate>
                            <SeparatorTemplate>
                                <tr>
                                    <td>
                                    </td>
                                </tr>
                            </SeparatorTemplate>
                            <AlternatingItemTemplate>
                                <table>
                                <tr>
                                    <td>
                                        <asp:TextBox runat="server" ID="txtAvaialbleEndPoints" Text='<%#Eval("Count") %>' ReadOnly="true">
                                        </asp:TextBox>
                                    </td>
                                    <td>
                                        <asp:TextBox runat="server" ID="txtConvertedEndPoints" Text='' ReadOnly="true">
                                        </asp:TextBox>
                                    </td>
                                    <td>                                       
                                            <tr>
                                                <td>
                                                    <asp:Label ID="lblcountryname" runat="server" Text='<%# Eval("Converted") %>'></asp:Label>
                                                </td>
                                                <td>25*
                                                </td>
                                            </tr>
                                        </table>
                                        <table>
                                            <tr>
                                                <td>
                                                    <asp:TextBox runat="server" ID="txtEndpoints" Text=''>
                                                    </asp:TextBox>
                                                </td>
                                                <td>
                                                    <asp:TextBox runat="server" ID="txtTotalEndPoints" Text='' ReadOnly="true">
                                                    </asp:TextBox>
                                                </td>
                                            </tr>
                                        </table>
                            </AlternatingItemTemplate>
                            <FooterTemplate>
                                </table>
                            </FooterTemplate>
                        </asp:Repeater>

谁能知道这个解决方案如何进行分组?

最佳答案

分组规则在您最初的问题中并不明显,但根据您的评论,我认为您需要

  • 按标识符对记录进行分组,例如 subid
  • 如果 converted 字段出现多次,则多次公开 subid 结果

我想你有一些类似于下面的类

public class InputModel
{
    public string legacy { get; set; }
    public string subid { get; set; }
    public string converted { get; set; }
    public string licPart { get; set; }
    public string count { get; set; }
}

public class OutputModel
{
    public string legacy { get; set; }
    public string subid { get; set; }
    public IList<string> list { get; set; }
    public string licPart { get; set; }
}

在其他解决方案中,您可以依赖 reducer/fold/aggregate方法,为此,C# 可枚举 .Aggregate 派上了用场(一些很好的例子也可以在 here 中找到)

var seed = new List<OutputModel>();
var outcome = records
    .Aggregate(seed, (results, current) =>
    {

        var query = from result in results
                    where result.legacy == current.legacy
                        && (result.list == null
                            || !result.list.Contains(current.converted))
                    select result;
        var output = query.FirstOrDefault();
        if (output == null)
        {
            output = new OutputModel
            {
                legacy = current.legacy,
                subid = current.subid,
                licPart = current.licPart,
                list = new List<string>
                {
                    current.converted
                }
            };

            results.Add(output);
        }
        else
        {
            output.list.Add(current.converted);
        }

        return results;
    });

给你这个

enter image description here

编辑

根据要求,请参阅下面将表映射到输入记录集合的一种方法

public static class Extensions
{
    public static IEnumerable<InputModel> Map(this DataTable instance)
    {
        foreach (DataRow row in instance.Rows)
        {
            yield return new InputModel
            {
                legacy = (string)row[0],
                subid  = (string)row[1],
                converted  = (string)row[2],
                licPart = (string)row[3],
                count = (string)row[4],
            };
        }
    }
}

关于c# - 使用 ASP.NET 使用数据表对数据进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47725998/

相关文章:

c# - .NET 配置 (app.config/web.config/settings.settings)

c# - 如何从 WCF asmx C# 获取客户端的计算机名称?

.net - 您将如何使用 DVCS(在我的例子中是 mercurial)来开发不同版本的 .NET 框架?

c# - 在 TextBox 上使用 StringFormat 绑定(bind)到 double

.net - 在编译期间强制使用特定的 .net 版本

.net - 使用 Office Interop 通过虚拟目录运行时出错

c# - 配置 ReSharper 只为非原始类型推荐 `var`?

asp.net - MVC AJAX 的 Jquery 或基本 XmlHttpRequest

asp.net - 升级到 Visual Studio 2013 后为 "Failed to load resource: the server responded with a status of 401 (Unauthorized)"

c# - sql server 24/7 插入删除选择性能