C# 如何使用LINQ查询创建列表?
我试图返回一个列表,这是我从这个查询中得到的, 但是得到错误: 无法从“System.Collections.Generic.List”转换为“System.Collections.Generic.IReadOnlyList”[HOLMES.docognition.Application]csharpCS1503 我是c和Linq的新手。请帮助解决此问题C# 如何使用LINQ查询创建列表?,c#,.net,linq,C#,.net,Linq,我试图返回一个列表,这是我从这个查询中得到的, 但是得到错误: 无法从“System.Collections.Generic.List”转换为“System.Collections.Generic.IReadOnlyList”[HOLMES.docognition.Application]csharpCS1503 我是c和Linq的新手。请帮助解决此问题 public async Task<ListResultDto<DashboardCountDto>> CountA
public async Task<ListResultDto<DashboardCountDto>> CountAllTrainDocuments()
{
var retList = new List<DashboardCountDto>();
var allTrainFiles = await _trainDocumentRepository.GetAllListAsync();
var CountTrainFiles = allTrainFiles.GroupBy(t=> t.DocumentTypeName).
Select(e => new {
//count = e.Count(),
DocumentTypeName = e.Key,
ProcessedDocument = e.Count(g => g.Processed = true),
UnProcessedDocument = e.Count(g => g.Processed = false),
}).ToList();
Dictionary<string, int> innerDict = new Dictionary<string, int>();
Dictionary<string, string> outterDict = new Dictionary<string, string>();
// return retList;
CountTrainFiles.ForEach(
row => Console.WriteLine($"DocType: {row.DocumentTypeName}, ProcessedDocument: {row.ProcessedDocument}, UnProcessedDocument: {row.UnProcessedDocument}"));
return new ListResultDto<DashboardCountDto>(CountTrainFiles);
我的DTO看起来像:
public class DashboardCountDto : EntityDto<long>
{
public string DocumentTypeName { get; set; }
public int ProceesedDocumentCount { get; set; }
public int UnProceesedDocumentCount { get; set; }
}
这:
创建在结构上看起来像DashboardCountDto但不是DashboardCountDto的。在new之后使用类名创建一个真实的类:
简短答复:
将您的Selectee=>new{更改为Selectee=>new DashboardCountDto{
那会解决你的问题
详细回答:
你的查询效率不高
数据库管理系统对执行数据库查询进行了极大的优化。数据库查询的较慢部分是将选定数据从DBMS传输到本地进程。因此,您应该尝试让DBMS完成所有处理,并尝试将所有传输的数据限制为DBMS无法再处理的数据
首先,获取所有列车文件的所有属性,并将其放入列表中。然后,本地进程将获取的列车文件分组为具有相同DocumentTypeName的列车文件组。从每组列车文件中,您扔掉了大多数东西,您只计算哪些被处理,哪些未被处理
让DBMS这么做会更有效率。看看你的存储库是否有一个返回IQueRebe的方法,而不是任务。如果存储库没有它,考虑把它添加到你的存储库。
IQueryable<TrainFile> trainFiles = trainDocumentRepository.TrainFiles();
// make groups of TrainFiles with Same documentName and count the number of Processed:
var groups = trainFiles.GroupBy(trainFile => trainFile.DocumentName,
// Parameter resultSelector: use each DocumentName, and all TrainFiles that have this
// value of DocumentName to make one new DashboardCountDto
(documentName, trainFilesWithThisDocumentName) => new DashboardCountDto
{
DocumentTypeName = documentTypeName,
Processed = trainFilesWithThisDocumentName
.Where(trainFile => trainFile.Processed)
.Count(),
UnProcessed = trainFilesWithThisDocumentName
.Where(trainFile => !trainFile.Processed)
.Count(),
});
现在,每个DocumentName都有一个对象,其中包含DocumentName,还有一个属性子组,它是两个对象的列表:一个为Process true,并统计所有使用此DocumentName处理的列车文件;另一个为Process false,并统计所有使用此DocumentName未处理的列车文件。[0]包含处理为false的组,[1]已处理为true
要创建子组,仅扫描一次具有此DocumentName的列车文件
最后一次选择将使您的查询完成:
.Select(group => new DashboardCountDto
{
DocumentName = group.DocumentName,
UnProcessed = group.SubGroup[0].Count,
Processed = group.SubGroup[1].Count,
})
使用Select创建DTO的实例
IQueryable<TrainFile> trainFiles = trainDocumentRepository.TrainFiles();
// make groups of TrainFiles with Same documentName and count the number of Processed:
var groups = trainFiles.GroupBy(trainFile => trainFile.DocumentName,
// Parameter resultSelector: use each DocumentName, and all TrainFiles that have this
// value of DocumentName to make one new DashboardCountDto
(documentName, trainFilesWithThisDocumentName) => new DashboardCountDto
{
DocumentTypeName = documentTypeName,
Processed = trainFilesWithThisDocumentName
.Where(trainFile => trainFile.Processed)
.Count(),
UnProcessed = trainFilesWithThisDocumentName
.Where(trainFile => !trainFile.Processed)
.Count(),
});
(documentName, trainFilesWithThisDocumentName) => new
{
DocumentName = documentName,
SubGroups = trainFilesWithThisDocomentName.GroupBy(trainFile => trainFile.Processed,
// Parameter resultSelector:
(processed, trainFilesWithThisValueOfProcessed) => new
{
Processed = processed,
Count = trainFilesWithThisValueOfProcessed.Count(),
})
.OrderByAscending(subGroup => subGroup.Processed)
.ToList(),
}),
.Select(group => new DashboardCountDto
{
DocumentName = group.DocumentName,
UnProcessed = group.SubGroup[0].Count,
Processed = group.SubGroup[1].Count,
})