【问题标题】:How to query a DataTable in memory to fill another data table如何查询内存中的 DataTable 以填充另一个数据表
【发布时间】:2011-08-18 14:41:14
【问题描述】:

我正在尝试更新 Microsoft 报告。它的作用是写出有多少客户被排除在转换过程之外以及出于什么原因。目前,该程序将所有已删除的客户端写回服务器,然后对其进行查询以用结果填充专业表。

这是当前查询:

SELECT  DeletedClients.Reason, 
        COUNT(DeletedClients.Reason) AS Number, 
        CAST(CAST(COUNT(DeletedClients.Reason) AS float) 
            / CAST(t.Total AS float) 
            * 100 AS numeric(4, 1)) AS percentage
FROM DeletedClients CROSS JOIN
    (SELECT COUNT(*) AS Total
    FROM DeletedClients AS DeletedClients_1
    WHERE (ClinicID = @ClinicID)) AS t
WHERE (DeletedClients.ClinicID = @ClinicID) 
    AND (DeletedClients.TotalsIdent = @ident)
GROUP BY DeletedClients.Reason, t.Total
ORDER BY Number DESC

我想要做的不是将DeletedClients 写入服务器,因为它已经作为 DataTable 存在于我的程序中的内存中,它只会减慢报告速度并用我们不需要保存的信息填充数据库.

我的主要问题是:

如何查询数据表以在内存中创建一个新的数据表,其结果与我写出 SQL 服务器并使用上面的查询将其读回一样?

如何在 Microsoft Reports 中对 Tablix 中的项目执行 group by 子句以将 =Fields!Reason.Value =Fields!Number.Value =Fields!percentage.Value 转换为类似于上述查询返回的结果?

【问题讨论】:

  • 这里有更多示例 - dotnetperls.com/datatable-select Select("Size >= 230 AND Sex = 'm'"); Select("日期 > #6/1/2001#");

标签: c# .net .net-4.0 reporting-services


【解决方案1】:

您可以使用DataTable.Select 来查询DataTable。

DataTable table = GetDataTableResults();
DataTable results = table.Select("SomeIntColumn > 0").CopyToDataTable();

或者对于更复杂的查询,您可以使用 LINQ 来查询 DataTable:

DataTable dt = GetDataTableResults();

var results = from row in dt.AsEnumerable()
              group row by new { SomeIDColumn = row.Field<int>("SomeIDColumn") } into rowgroup
              select new
              {
                  SomeID = rowgroup.Key.SomeIDColumn,
                  SomeTotal = rowgroup.Sum(r => r.Field<decimal>("SomeDecimalColumn"))
              };                    

DataTable queryResults = new DataTable();
foreach (var result in query)
    queryResults.Rows.Add(new object[] { result.SomeID, result.SomeTotal });

【讨论】:

  • 使用 LINQ 或 DataTable.Select 如何使用 Group by 子句?因为这是我翻译的主要问题。
  • 使用 LINQ 可以,但我认为使用 DataTable.Select 不可能。我认为您可以使用 DataTable.Compute 进行一些基本的分组,但它是有限的。如果您希望在代码中对信息进行分组,LINQ 是您的最佳选择。
  • 你能举例说明如何使用 group by 编写 LINQ 吗?
  • 除了 CopyToDataTable 之外,它似乎都可以正常工作。我收到错误The type 'AnonymousType#1' cannot be used as type parameter 'T' in the generic type or method 'System.Data.DataTableExtensions.CopyToDataTable&lt;T&gt;(System.Collections.Generic.IEnumerable&lt;T&gt;)'. There is no implicit reference conversion from 'AnonymousType#1' to 'System.Data.DataRow'.
  • @Scott Chamberlain:我已经更新了我的答案。 CopyToDataTable 更优雅,但手动加载技术也应该可以正常工作。
【解决方案2】:

我可以想到两种查询数据表的方法。下面是使用这两种方式的示例。

using System;
using System.Data;

namespace WindowsFormsApplication1
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            var deletedClients = GetDataTable();

            // Using linq to create the new DataTable.
            var example1 = deletedClients.AsEnumerable()
                                         .Where(x => x.Field<int>("ClinicId") == 1)
                                         .CopyToDataTable();

            // Using the DefaultView RowFilter to create a new DataTable.
            deletedClients.DefaultView.RowFilter = "ClinicId = 1";
            var rowFilterExample = deletedClients.DefaultView.ToTable();
        }

        static DataTable GetDataTable()
        {
            var dataTable = new DataTable();
            // Assumes ClinicId is an int...
            dataTable.Columns.Add("ClinicId", typeof(int));
            dataTable.Columns.Add("Reason");
            dataTable.Columns.Add("Number", typeof(int));
            dataTable.Columns.Add("Percentage", typeof(float));

            for (int counter = 0; counter < 10; counter++)
            {
                dataTable.Rows.Add(counter, "Reason" + counter, counter, counter);
            }

            return dataTable;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2013-08-02
    • 2013-07-30
    • 2022-01-13
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多