【问题标题】:Aggregate distinct count in LINQ - VB.NET在 LINQ 中聚合不同的计数 - VB.NET
【发布时间】:2023-03-18 10:20:02
【问题描述】:

我有一个来自数据库并进入 PagedDataSource 的数据。数据来自一个查询,该查询提取了大约 10 条记录和大约 20 列。基于一个 varchar 列名“源”,我想找到源的唯一实例。这是一个非常基本的查询。在 SQL 中,我会这样做:

select count(distinct source) from SourceTable

我尝试了以下方法,它确实给出了计数但不是不同的(或唯一的)计数。

Dim query = Aggregate source In pagedDS
            Into Count()

我不知道如何在 LINQ 查询中选择列以及如何仅通过一列应用聚合。我在 VB.NET 中需要这个,但 C# 解决方案应该足够接近。

【问题讨论】:

    标签: c# vb.net linq dataset linq-query-syntax


    【解决方案1】:

    由于PagedDataSource 没有实现IEnumerable<T>,只是IEnumerable,因此您需要先使用Cast 将序列转换为正确类型的序列。您需要知道序列中对象的实际类型是什么,因为您没有在这里提到它。

    然后只需一个接一个地应用每个操作:

    (在 C# 中:)

    var query = table.Cast<YourTypeGoesHere>()
        .Select(item => item.Column)
        .Distinct()
        .Count();
    

    【讨论】:

    • @Nick 这是 C# 代码,不是 VB 代码,但翻译应该足够简单。您明确表示您不在乎答案是 C# 还是 VB。
    • 我需要它在 VB.NET 中工作,但如果 VB 解决方案不可用,我可以将其翻译成 VB。
    • 在VB中,如下(并使用'Option Infer On'): Dim query = table.Select(Function(item) item.Column).Distinct().Count()
    • 我想因为我使用的是 PagedDataSource,所以上面的查询并不完全有效。我知道它适用于表格,但不适用于 PagedDataSource。如果需要,我将再次考虑将 PagedDataSource 更改为 DataTable。
    • @Nick 查看编辑;您需要先使用Cast 获得IEnumerable&lt;T&gt;,然后才能使用大多数LINQ 方法。
    【解决方案2】:

    我放弃了PageDataSource,因为我无法以我想要的方式使用 LINQ。我只是为此目的引入了一个 DataTable,并在 DataTable 上运行了我的查询,效果很好。这是代码

        Dim dv As New System.Data.DataView
        Dim dt As New System.Data.DataTable
        dv = osReviews.Select(DataSourceSelectArguments.Empty)
        dt = dv.ToTable()
    
    
        Dim query = (From row In dt
                     Select row("Source") Distinct).Count()
    

    【讨论】:

      【解决方案3】:

      由于我们在 Visual Basic 中有 Distinct 关键字,您可以使用以下查询:

      Dim query = (From b In Locales
                   Select b.Id Distinct).Count()
      

      【讨论】:

        猜你喜欢
        • 2013-09-04
        • 1970-01-01
        • 1970-01-01
        • 2020-11-19
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多