Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ查询创建列表?_C#_.net_Linq - Fatal编程技术网

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

我试图返回一个列表,这是我从这个查询中得到的, 但是得到错误:

无法从“System.Collections.Generic.List”转换为“System.Collections.Generic.IReadOnlyList”[HOLMES.docognition.Application]csharpCS1503

我是c和Linq的新手。请帮助解决此问题

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,
})