2017-10-06 60 views
0

什麼是最有效的方式來從多個父類型檢索兒童,並關聯他們

一)檢索所有的孩子從多個父類型的對象,並

B)知道父類型是什麼,該每個孩子的確切父母身份?

目前這是我正在做的事情,它效率極低,至少是我找到每個孩子的特定父母的部分。

public class ChildModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class ParentType1Model 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<ChildModel> Children { get; set; } 
} 

public class ParentType2Model 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<ChildModel> Children { get; set; } 
} 

//Get all ChildModels from ParentType1 
var parentType1Children = db.ParentType1Models 
    .SelectMany(x => x.Children) 
    .ToList(); 

listOfChildModels.AddRange(parentType1Children); 

//Get all ChildModels from ParentType2 
var parentType2Children = db.ParentType2Models 
    .SelectMany(x => x.Children) 
    .ToList(); 

listOfChildModels.AddRange(parentType2Children); 


//Find the parent for each ChildModel 
foreach (var child in listOfChildModels) 
{ 
    ParentType1Model parentType1ModelCheck = null; 
    ParentType2Model parentType2ModelCheck = null; 

    parentType1ModelCheck = await db.ParentType1Models 
     .Where(p => p.Children 
     .Any(i => i.Id == child.Id)) 
     .FirstOrDefaultAsync(); 

    //If first check is null, then move to second check 
    if (taskProjectModelCheck == null) 
    { 
     parentType2ModelCheck = await db.ParentType2Models 
      .Where(p => p.Children 
      .Any(i => i.Id == child.Id)) 
      .FirstOrDefaultAsync(); 
    } 

    //Now record the parent type and parent Id in an object containing the original ChildModel and it's parent's info (to be used later for various things) 
    ChildViewModel childViewModel = new ChildViewModel(); 
    childViewModel.ChildModel = child; 
    if (parentType1ModelCheck != null) 
    { 
     childViewModel.ParentType = "ParentType1"; 
     childViewModel.ParentModelId = parentType1ModelCheck.Id; 
    } 

    else if (parentType2ModelCheck != null) 
    { 
     childViewModel.ParentType = "ParentType2"; 
     childViewModel.ParentModelId = parentType2ModelCheck.Id; 
    }   
} 

回答

0

我結束了使用原始SQL,它非常快。 通過直接針對數據庫編寫查詢,我可以直接轉到由設置ParentTypeXModels和ChildModels時由Entity Framework創建的多對多關係表。

result = dbContext.Database.SqlQuery<ANewChildObject>(
"select 
    ParentModelId = pm.Id, 
    Id = c.Id, 
    ParentType = 'ParentType1' 
from dbo.ChildModels c 
    JOIN dbo.ParentType1ModelsChildModels pmT ON c.Id = pmT.ChildModel_Id 
    JOIN dbo.ParentType1Models pm on pmT.ParentType1Model_Id = pm.Id 

UNION ALL 

select 
    ParentModelId = pm.Id, 
    Id = c.Id, 
    ParentType = 'ParentType2' 
from dbo.ChildModels c 
    JOIN dbo.ParentType2ModelsChildModels pmT ON c.Id = pmT.ChildModel_Id 
    JOIN dbo.ParentType2Models pm on pmT.ParentType2Model_Id = pm.Id" 
).ToList(); 
1

這樣的事情呢?

var ids1 = from p in db.ParentType1Models 
      from c in p.Children 
      select new 
      { 
       parentId = p.Id, 
       parentName = p.Name, 
       childName = c.Name, 
       childId = c.Id, 
       ParentType = "One" 
      }; 


var ids2 = from p in db.ParentType2Models 
      from c in p.Children 
      select new 
      { 
       parentId = p.Id, 
       parentName = p.Name, 
       childName = c.Name, 
       childId = c.Id, 
       ParentType = "Two" 
      }; 

var results = ids1.Union(ids2).ToList(); 
+0

這個簡化和縮短了代碼,但最終它增加了大約3倍的響應時間。 – amartin

+1

@amartin這是不幸的。我列入了示範名稱。也許限制僅僅是ID會讓它只能達到索引。很難知道沒有看到查詢計劃。 – Rob

+0

我相信你是對的,但不幸的是我需要ChildModels的很多屬性。 – amartin