对孩子进行核心搜索,对父母进行排序

时间:2021-02-11 07:39:17

标签: sql asp.net entity-framework asp.net-core entity-framework-core

我有两个模型父和子,我想检索所有具有 unitid = 5 并按家庭排序的不同父

 public class Parent
{
    public int Id { get; set; }
    public string Family { get; set; }
    public List<Child> Children { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public int ParentId { get; set; }
    public int UnitId { get; set; }
    public Parent parent { get; set; }
}

父表有 500000 条记录,子表有 2000000 条记录。我使用 SelectMany 和 Distinct 但检索记录需要 8 秒

var parents= Context.Set<Parent>()
                    .SelectMany(x => x.Children.DefaultIfEmpty(), 
                                (u, r) => new { 
                                          Parent = u, 
                                          Child = r })
                    .Where(x=>x.Child.UnitId == 5)
                    .Select(m => new Parent{ 
                                      Id = m.Parent.Id, 
                                      Family= m.Parent.Family
                                 })
                    .Distinct()
                    .OrderBy(x=>x.Family)
                    .Take(30).Skip(0).ToList();

翻译成:

SELECT [t].[Id], [t].[Family] FROM (
SELECT  distinct [a].[Id],  [a].[Family]
FROM [Parent]  AS [a]
LEFT JOIN [Children] AS [r] ON [a].[Id] = [r].[ParentId]
WHERE  ([r].[unitid] = 5) AS [t] ORDER BY [t].[family] OFFSET 0 ROWS FETCH next 30 ROWS ONLY

var parents = Context.Set<Children>()
                     .Include(x=>x.Parent)
                     .Where(x=>x.UnitId ==5)
                     .Select(m => new Parent{ 
                                      Id = m.ParentId , 
                                      Family = m.Parent.Family})
                     .Distinct()
                     .OrderBy(x=>x.Family)
                     .Take(30).Skip(0).ToList();

翻译成:

SELECT [t0].[Id],[t0].[Family] FROM ( SELECT DISTINCT [t].[Id], [t].[Family]
FROM [Children] AS [r]
INNER JOIN (
    SELECT [a].[Id] , [a].[Family]
    FROM [Parent] AS [a]
) AS [t] ON [r].[ParentId] = [t].[Id]
WHERE ([r].[UnitId] = 5)  AS [t0] ORDER BY [t0].[Family] OFFSET 0 ROWS FETCH next 30 ROWS ONLY

1。按 id 使用 order 时非常快

2。按家庭使用顺序取,跳过慢

3 .家庭已编入索引

4。 EF 核心 3.1

哪个解决方案是正确的或更好的?

1 个答案:

答案 0 :(得分:0)

检查这两个查询的性能:

var parents = 
    from p in Context.Set<Parent>()
    where p.Children.Any(c => c.UnitId == 5)
    orderby p.Family
    select p;

parents = parents
    .Take(30)
    .Skip(0)
    .ToList();

还有一个:

var parentIds = 
    from c in Context.Set<Child>()
    where c.UnitId == 5
    select c.ParentId

var parents = 
    from p in Context.Set<Parent>()
    join id in parentIds.Distinct() on p.Id equals id
    orderby p.Family
    select p;

parents = parents
    .Take(30)
    .Skip(0)
    .ToList();
相关问题