2017-06-21 98 views
2

TLDR:我试图从用户显示的引用,用户B,我想用户B要能够认识有一个从用户A参考。如何创建交叉引用检查?

在我的申请,我在那里我连接用户彼此才能看到它们之间的关系(例如,兄弟,姐妹等)这一部分被称为案例交叉参考的部分。

我与他们案例GUID连接的用户。

如果我想连接用户A用户B,它只是把我是从为From_Case连接用户和其他用户为To_Case

Cross Reference table

现状

我目前能够显示从用户A用户B,反之亦然,但连接时,我去用户B,它并没有显示正确的案件编号关系

ToCases = await db.CaseCrossReference 
        .Include(x => x.Relationship) 
        .Include(x => x.Type) 
        .Include(x => x.Case2.CaseNumber) 
        .Where(x => (x.From_Case == cid || x.To_Case == cid) 
           && x.Deleted == false) 
        .Select(o => new CaseCrossReferenceToRelationshipViewModel() 
        { 
         CaseIdFrom = o.From_Case, 
         CaseIdTo = o.To_Case, 
         CaseCrossReferenceId = o.CaseCrossReferenceId, 
         CaseNumber = o.Case2.CaseNumber == null ? null : o.Case2.CaseNumber.CaseNumberPrefix + "-" + o.Case2.CaseNumber.Number, 
         LivingTogether = o.LivingTogether, 
         Split = o.Split, 
         SplitDate = o.SplitDate, 
         SplitReason = o.SplitReason, 
         Type = o.Type.Definition, 
         RelationshipDefinition = o.Relationship.Definition 
        }).ToListAsync() 


foreach (var cases in model.ToCases) 
      { 
        // Check for any reverse relationships 
        var reference = await db.CaseCrossReference.Include(x => x.Relationship).Include(x => x.Case1.CaseNumber).FirstOrDefaultAsync(m => m.From_Case == cases.CaseIdFrom && m.To_Case == cases.CaseIdTo); 
        if (reference != null) 
         { 
          if (cases.Gender == "M") 
          { 
           cases.RelationshipDefinition = await relationshipsdd.Where(r => r.Id == reference.Relationship.Id).Select(r => r.MaleReverseRelationshipDefinition).FirstOrDefaultAsync(); 
           cases.CaseCrossReferenceId = reference.CaseCrossReferenceId; 
           cases.CaseNumber = reference.Case1.CaseNumber?.Number == null ? null : reference.Case1.CaseNumber.CaseNumberPrefix + "-" + reference.Case1.CaseNumber.Number; 
          } 
          else 
          { 
           cases.RelationshipDefinition = await relationshipsdd.Where(r => r.Id == reference.Relationship.Id).Select(r => r.FemaleReverseRelationshipDefinition).FirstOrDefaultAsync(); 
           cases.CaseCrossReferenceId = reference.CaseCrossReferenceId; 
           cases.CaseNumber = reference.Case1.CaseNumber?.Number == null ? null : reference.Case1.CaseNumber.CaseNumberPrefix + "-" + reference.Case1.CaseNumber.Number; 
          } 

         } 
      } 

你可能不知道什么是CID。这是CaseID /案例GUID查询字符串值。当我在用户A是,该CID是用户A GUID,当我去用户B它的用户B GUID。只要它是目前案件ID。

我需要能够做到以下几点:

无论在哪个用户我在,我应该能够看到其他用户(S)的连接。如果我在用户B我,那么我就应该能看到,我要用户A,反之亦然连接。

下面的图片展示了如我在PS-100002,我可以看到我有连接PS-100000nm正确的情况。 Reference PS-100002

但如果去PS-100000nm,我仍然看到PS-100000nm作为我的参考。它需要是PS-100002与正确的关系(父亲)。

Reference PS-100000

能否请你帮我找到这个问题的妥善解决办法?

专用房间这个话题:https://chat.stackexchange.com/rooms/60854/room-for-forrest-and-kevin-maxwell

+0

凯文,尝试定义什么PS-XXXX代表或用易于识别的术语取代它们。如果他们每个都代表案例,可以命名为案例。 – Sometowngeek

回答

2

我基本上不得不扭转成员之间的关系。所以我想出了以下解决方案:

var member = await db.Member.Include(x => x.Gender).Include(x => x.Case.CaseNumber) 
      .FirstOrDefaultAsync(x => x.Relationship.Code == "PA" && x.CaseId == cid && x.Deleted == false); 
     var relationshipsdd = db.RelationshipDD; 

     var model = new CaseCrossReferenceFromRelationshipViewModel() 
     { 
      MemberId = member?.MemberId, 
      FirstName = member?.FirstName, 
      MiddleName = member?.MiddleName, 
      LastName = member?.LastName, 
      Gender = member?.Gender.Code, 
      CaseNumber = member?.Case.CaseNumber?.Number == null 
       ? null 
       : member.Case.CaseNumber?.CaseNumberPrefix + "-" + member.Case.CaseNumber?.Number, 
      CaseId = member?.CaseId, 


      ToCases = await db.CaseCrossReference 
       .Where(x => (x.From_Case == cid || x.To_Case == cid) 
          && x.Deleted == false) 
       .Select(o => new CaseCrossReferenceToRelationshipViewModel() 
       { 
        CaseIdFrom = o.From_Case, 
        CaseIdTo = o.To_Case, 
        CaseCrossReferenceId = o.CaseCrossReferenceId, 
        LivingTogether = o.LivingTogether, 
        Gender = o.Relationship.Gender.Code, 
        Split = o.Split, 
        SplitDate = o.SplitDate, 
        SplitReason = o.SplitReason, 
        Type = o.Type.Definition, 
        RelationshipDefinition = o.Relationship.Definition, 
        Relationship = o.Relationship.Id 
       }).ToListAsync() 
     }; 


     foreach (var cases in model.ToCases) 
     { 
      // Check for any reverse relationships/Case Number 
      var reference = await db.CaseCrossReference.Include(x => x.Relationship) 
       .Include(x => x.Case2.CaseNumber).Include(x => x.Case1.CaseNumber) 
       .FirstOrDefaultAsync(m => m.From_Case == cases.CaseIdFrom && m.To_Case == cases.CaseIdTo); 

      if (cases.CaseIdFrom == cid) 
      { 
       member = await db.Member.Include(x => x.Gender) 
        .FirstOrDefaultAsync(x => x.Relationship.Code == "PA" && x.CaseId == cases.CaseIdTo && 
               x.Deleted == false); 

       cases.CaseIdFrom = cases.CaseIdTo; 
       cases.CaseNumber = reference.Case2.CaseNumber?.Number == null 
        ? null 
        : reference.Case2.CaseNumber.CaseNumberPrefix + "-" + reference.Case2.CaseNumber.Number; 
       cases.FirstName = member.FirstName; 
       cases.MiddleName = member.MiddleName; 
       cases.LastName = member.LastName; 

       if (member.Gender.Code == "M") 
       { 
        cases.RelationshipDefinition = await relationshipsdd 
         .Where(r => r.Id == reference.Relationship.Id) 
         .Select(r => r.MaleReverseRelationshipDefinition).FirstOrDefaultAsync(); 
       } 
       else 
       { 
        cases.RelationshipDefinition = await relationshipsdd 
         .Where(r => r.Id == reference.Relationship.Id) 
         .Select(r => r.FemaleReverseRelationshipDefinition).FirstOrDefaultAsync(); 
       } 
      } 
      else 
      { 
       member = await db.Member.Include(x => x.Gender) 
        .FirstOrDefaultAsync(x => x.Relationship.Code == "PA" && x.CaseId == cases.CaseIdFrom && 
               x.Deleted == false); 
       cases.CaseIdTo = cases.CaseIdFrom; 
       cases.CaseNumber = reference.Case1.CaseNumber?.Number == null 
        ? null 
        : reference.Case1.CaseNumber.CaseNumberPrefix + "-" + reference.Case1.CaseNumber.Number; 
       cases.FirstName = member.FirstName; 
       cases.MiddleName = member.MiddleName; 
       cases.LastName = member.LastName; 
      } 
     } 


     return View(model); 
1

只是不要.ToList()的第一个查询。一旦使用ToList()获取结果,您将不得不使用Lazy Loading来导航导航属性。但是,如果它在一个查询中,则投影ViewModel类型的列将在单个SQL查询中获取。

ToCases  = await db.CaseCrossReference 
         .Include(x => x.Relationship) 
         .Include(x => x.Type) 
         .Where(x => (x.From_Case == cid || x.To_Case == cid) 
             && x.Deleted == false) 
         .Select(o => new CaseCrossReferenceToRelationshipViewModel() 
       { 
        CaseId = o.From_Case, 
        CaseCrossReferenceId = o.CaseCrossReferenceId, 
        CaseNumber = o.Case2.CaseNumber?.Number == null ? null : o.Case2.CaseNumber.CaseNumberPrefix + "-" + o.Case2.CaseNumber.Number, 
        LivingTogether = o.LivingTogether, 
        Split = o.Split, 
        SplitDate = o.SplitDate, 
        SplitReason = o.SplitReason, 
        Type = o.Type.Definition, 
        RelationshipDefinition = o.Relationship.Definition 

       }).ToListAsync(); 
+0

谢谢。根据你的建议,我改变了我的查询。结果是相同的,但我认为你的查询会提高性能,对吧? –

+1

是的,性能会更好。那么,实际问题是什么? –

+0

尝试创建简化的模型和repro,包括插入实体成员和预期结果。如果可以的话,张贴。 –