Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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/1/asp.net/30.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# 通过对同一个表进行2次选择来改进此Linq_C#_Asp.net_Entity Framework_Linq - Fatal编程技术网

C# 通过对同一个表进行2次选择来改进此Linq

C# 通过对同一个表进行2次选择来改进此Linq,c#,asp.net,entity-framework,linq,C#,Asp.net,Entity Framework,Linq,嗨,我有一个查询,它用状态为Completed的child填充CompletedWords和CompletedRows,问题是它在segments表中运行了2倍,而不是1倍: var query = _context.Submodules.Where(t => t.Id == id) .Select(e => new Submodules{ Id = e.Id,

嗨,我有一个查询,它用状态为Completed的child填充CompletedWords和CompletedRows,问题是它在segments表中运行了2倍,而不是1倍:

var query = _context.Submodules.Where(t => t.Id == id)
                    .Select(e => new Submodules{
                        Id = e.Id,
                        Name = e.Name,
                        Status = e.Status,
                        Token = e.Token,
                        ModuleId = e.ModuleId,
                        Gender = e.Gender,
                        TotalRows = e.TotalRows,
                        TotalWords = e.TotalWords,
                        CompletedWords = e.Segments.Where(a => a.Status == Abr.Recorded).Sum(y=> y.Wordcount),
                        CompletedRows = e.Segments.Where(a => a.Status == Abr.Recorded).Count()
                    }).ToList();
这意味着:

SELECT t.ID, t.name, t.status, t.token, t.moduleID,
t.gender, t.total_rows AS TotalRows, t.total_words AS TotalWords, 
(
    SELECT SUM(a.wordcount)
    FROM segments AS a
    WHERE (a.status = 1) AND (t.ID = a.submoduleID)
) AS CompletedWords, (
    SELECT COUNT(*)
    FROM segments AS a0
    WHERE (a0.status = 1) AND (t.ID = a0.submoduleID)
) AS CompletedRows
FROM submodules AS t
WHERE t.ID = @__id_0
如您所见,要填充已完成的单词和行, 它运行2个选择,其中状态==1,一个是它的总和,另一个是Count(),如何将它们合并到。1选择。

请注意,除非您明确看到性能问题,否则我不会太担心EF生成的SQL。数据库引擎非常擅长自我优化

但要回答您的问题,这应该是可行的:

var query = _context.Submodules.Where(t => t.Id == id)
                    .Select(e => new {
                        Id = e.Id,
                        Name = e.Name,
                        Status = e.Status,
                        Token = e.Token,
                        ModuleId = e.ModuleId,
                        Gender = e.Gender,
                        TotalRows = e.TotalRows,
                        TotalWords = e.TotalWords,
                        ComletedSegments = e.Segments
                           .Where(a => a.Status == Abr.Recorded)
                           .Select(y => new { y.Wordcount })
                           .ToList()
                    }).ToList()
                    .Select(e => new Submodules{
                        Id = e.Id,
                        Name = e.Name,
                        Status = e.Status,
                        Token = e.Token,
                        ModuleId = e.ModuleId,
                        Gender = e.Gender,
                        TotalRows = e.TotalRows,
                        TotalWords = e.TotalWords,
                        CompletedWords = e.Sum(y=> y.Wordcount),
                        CompletedRows = e.Count()
                    }).ToList();
第一个查询选择匿名类型,以从适用的已完成段中选择字数。
ToList()
具体化并执行查询。对于段,您可以省略
.Select()
,尽管这会将所选数据减少到我们关心的列


第二个
.Select()!是的,主要是因为这是我为新工作开发的第一个大型软件,而且从头到尾都没有做过任何大事,所以我真的希望它很好,并从中学习。现在已经了解了select的工作原理,这就更好了。真的谢谢!