使用Linq或不使用Linq获取DataTable的行数

时间:2014-02-26 03:39:37

标签: c# linq

我开发了一个Windows C#应用程序。在我的代码中使用了以下数据表。

DataTable dtManagerSummary = new DataTable();
dtManagerSummary.Columns.Add("Lead Owners", typeof(string));
dtManagerSummary.Columns.Add("Grand Total", typeof(Int32));
dtManagerSummary.Columns.Add("Account", typeof(string));
dtManagerSummary.Columns.Add("RL # Click to update", typeof(string));
dtManagerSummary.Columns.Add("RL Status", typeof(string));
dtManagerSummary.Columns.Add("Aging time", typeof(Int32));

我的实际结果是:

Lead Owner | Account name | RL # Click to update | RL Status | Aging Time | Grand Total
---------------------------------------------------------------------------------------
Kavin      | ANU          | RL - 001488727       | RequireFU | 2          | 1
Kavin      | DOD          | RL - 001488734       | RequireFU | 2          | 1
Oviya      | IPA          | RL - 001488736       | RequireFU | 2          | 1  
Thamizh    | NLA          | RL - 001488733       | RequireFU | 2          | 1
Thamizh    | Comcare      | RL - 001488735       | RequireFU | 2          | 1
Thamizh    | AFP          | RL - 001488740       | RequireFU | 2          | 1  

预期结果:

Lead Owner | Account name | RL # Click to update | RL Status | Aging Time | Grand Total
---------------------------------------------------------------------------------------
Kavin      | ANU          | RL - 001488727       | RequireFU | 2          | 2
Kavin      | DOD          | RL - 001488734       | RequireFU | 2          | 2
Oviya      | IPA          | RL - 001488736       | RequireFU | 2          | 1  
Thamizh    | NLA          | RL - 001488733       | RequireFU | 2          | 3
Thamizh    | Comcare      | RL - 001488735       | RequireFU | 2          | 3
Thamizh    | AFP          | RL - 001488740       | RequireFU | 2          | 3

从上面的示例中,Grand Total列中的值应基于Lead Owner列的计数。 Kavin来了2次,Oviya 1次,Tahmizh 3次。

注意: 不应按“所有者”列进行分组。

有人可以帮我实现这个目标吗? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

使用LINQ:

为了使用LINQ,集合必须实现IEnumerable<T>接口。所以我们需要做的第一件事就是将DataRowCollection类中包含的数据按下来。我们使用Cast<T>方法来完成此任务。

这是一个代码示例:

string leadOwner = "Kavin";
var rows = dtManagerSummary.Rows.Cast<DataRow>();
int count = rows.Where(row => (string)row["Lead Owners"] == leadOwner).Count();

没有LINQ:

您可以使用DataTable类包含的内置支持。但是,请将"Lead Owners"重命名为"LeaderOwners"或其他没有空格的内容,以使此方法有效。

这使用DataTable.Select Method (String),其中string参数位于正确的RowFilter syntax之后。

以下是实现此方法的代码:

string leadOwner = "Kavin";
string expression = String.Format("LeadOwners = '{0}'", leadOwner);
int count = dt.Select(expression).Length;

在任何一种方法中,结果count在您的情况下都是2。

答案 1 :(得分:0)

您可以通过将DataTable转换为List并使用Linq查询生成的列表来完成此操作。 您应该更改数据表列名称,因为它们之间不包含任何空格。例如主要拥有者 Lead_Owners

我创建了一个包含Columns as Fields的对象 -

  

objResult

List<DataRow> list = dtManagerSummary .AsEnumerable().ToList(); 

            var summery = (from d in list 

                           group d by new { d.Lead_Owners,d.Account_name}
                               into g
 select new objResult
                        {
Lead_Owners= (from d in g
               where d.Lead_Owners== g.Lead_Owners
               select d.Lead_Owners
              ).First(),

Account_name= (from d in g
               where d.Lead_Owners== g.Lead_Owners
               select d.Account_name
               ).First(),

RL= (from d in g
               where d.Lead_Owners== g.Lead_Owners
              select d.RL
               ).First(),

RL_Status= (from d in g
             where d.Lead_Owners== g.Lead_Owners 
             select d.RL_Status
              ).First(),

Aging_Time= (from d in g
             where d.Lead_Owners== g.Lead_Owners  
             select d.Aging_Time
             ).First(),
 Grand = g.Sum(S => S.Grand )

}).ToList();

这是一个简单的例子来做所需的事情。您必须尝试将其应用于您的问题。 不要复制并过去这样。试着自己动手......