C# 通过对同一个表进行2次选择来改进此Linq
嗨,我有一个查询,它用状态为Completed的child填充CompletedWords和CompletedRows,问题是它在segments表中运行了2倍,而不是1倍: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,
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的工作原理,这就更好了。真的谢谢!