我开发了一个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次。
注意: 不应按“所有者”列进行分组。
有人可以帮我实现这个目标吗? 提前谢谢。
答案 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();
这是一个简单的例子来做所需的事情。您必须尝试将其应用于您的问题。 不要复制并过去这样。试着自己动手......