2012-06-22 81 views
1

id'like用于统计用户编辑或创建的文档数量。因此我有一个包含信息的Datatable。像这样:LINQ计数和按不同列分组

Input 
DocumentName | ModifiedBy | CreatedBy 
a    Frank   Frank 
b    Mike   Frank 
c    John   Mike 

这应该是输出:

Name DocumentsModified(Total) DocumentsCreated(Total) 
Frank  1      2 
Mike  1      1 
John  1      0 

那么它确实算一个人编辑的所有文件,如下

var query = from queryResult in resultTable.AsEnumerable() 
group queryResult by queryResult.Field<string>("ModifiedBy") into rowGroup 
select new 
{ 
    Name = rowGroup.Key, ModifiedDocuments = rowGroup.Count() 
}; 

这工作得很好。现在我还要计算“创建者”列的值。这是可能的,如果是这样,我该怎么做?好的,我可以遍历表,但在LinQ查询中完成此操作会很好。

我试图用“group queryResult by new {}”,但我不确定我是否在正确的轨道上。

+0

预期产量是多少?你是否想要一个人的名字清单,这些人是谁修改过的所有文件的创建者?你只是想要每个人修改每个文件的不同创作者的数量?你想只是每个人创建文件的数量?样本输入/输出也会有帮助。 – Servy

+1

@Servy:感谢您的回复,我添加了一个例子。 – user1475002

回答

1

最好的办法就是单独查询创建和修改,然后将结果与连接结合起来。

var modifiedCount = from queryResult in resultTable.AsEnumerable() 
group queryResult by queryResult.Field<string>("ModifiedBy") into rowGroup 
select new 
{ 
    Name = rowGroup.Key, ModifiedDocuments = rowGroup.Count() 
}; 

var createdCount = from queryResult in resultTable.AsEnumerable() 
group queryResult by queryResult.Field<string>("CreatedBy") into rowGroup 
select new 
{ 
    Name = rowGroup.Key, CreatedDocuments = rowGroup.Count() 
}; 

var finalResult = from first in modifiedCount 
        join second in createdCount 
        on first.Name equal second.Name 
        select new 
        { 
        first.Name, 
        first.ModifiedDocuments, 
        second.CreatedDocuments 
        }; 
+0

作品完美,谢谢! – user1475002

1

你不能用CreatedBy的方法吗?

var query2 = from queryResult in resultTable.AsEnumerable() 
group queryResult by queryResult.Field<string>("CreatedBy") into rowGroup 
select new 
{ 
    Name = rowGroup.Key, ModifiedDocuments = rowGroup.Count() 
}; 

然后使用您的2个查询按名称排序。

+0

如果我理解你是正确的,这导致Servy的答复方向相同?为我工作得很好,谢谢你的回答! – user1475002