2017-09-05 35 views
0

概念如何结合使用EF的两个相关模型的相关数据?

我有两个模型是一对多的关系相关。第一种模式基本上存储患者信息(PatReg)。第二个模型加入合作伙伴(PatPar)。即(FileId = 1Sam,FileId = 2维多利亚,FileId = 3杰西卡,FileId = 4Micaica)信息全部存储在PatReg中。以说,山姆是维多利亚和杰西卡的合作伙伴我加入他们的行列中PatPar以下方式:

FileId= 1 FileId=2 
    FileId= 1 FileId=3 

以下状态这两种模式。

public class PatReg 
    { 
     public Int64 FileId { get; set; } 
     [Required, Display(Name = "First Name")] 
     public string FName { get; set; } 
     [Required, Display(Name = "Middle Name")] 
     public string MName { get; set; } 
     [Required, Display(Name = "Last Name")] 
     public string LName { get; set; } 
     [Display(Name = "Full Name"), NotMapped] 
     public string fullname 
     { 
      get { return FName + " " + MName + " " + LName; } 
     } 
     [Required, Display(Name = "Date of Birth")] 
     [DataType(DataType.Date)] 
     public DateTime Dob { get; set; } 
     public ICollection<PatPar> PatPar { get; set; } 
    } 

    public class PatPar 

    { 
     [Key] 
     public Int64 RecId { get; set; } 
     [Display(Name = "Patient File Id"), Required] 
     public Int64 FileId { set; get; } 
     [Display(Name = "Partner File Id"), Required] 
     public Int64 ParFileId { set; get; } 
     [Display(Name = "Start Date"), DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true), Required] 
     public DateTime SDate { set; get; } 
     [Display(Name = "End Date"), DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] 
     public DateTime? EDate { set; get; } 
    } 

快速检索 我米用在我的项目,我查询我的记录如下方式的API controller

[HttpGet("{id}")] 
    public async Task<IActionResult> GetPatReg([FromRoute] long id) 
    { 

     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 
     var patReg = await _context.PatReg.SingleOrDefaultAsync(m => m.FileId == id);  // here I get my Main Record 
     var patRegPar = await _context.PatPar // here I get related Records 
      .Where(m => m.FileId == id) 
      .ToListAsync(); 
     if (patReg == null) 
     { 
      return NotFound(); 
     } 

     var DataRes = new { 
      sdata = patReg     
     }; 

     return Ok(DataRes); 
    } 

所得JSON

{ 
    "sdata": { 
     "fileId": 1708010001, 
     "fName": "Json", 
     "mName": "S", 
     "lName": "Makenzi", 
     "fullname": "Json S Abu Makenzi", 
     "dob": "1984-04-26T00:00:00", 
     "patPar": [{ 
      "recId": 2, 
      "fileId": 1708010001, 
      "parFileId": 1708010002, 
      "sDate": "1999-12-12T00:00:00", 
      "eDate": null, 
     }, { 
      "recId": 3, 
      "fileId": 1708010001, 
      "parFileId": 1708010003, 
      "sDate": "1955-12-14T00:00:00", 
      "eDate": null, 
     }] 
    } 
} 

我想要我的JSON输出吨patPar列表看起来像每个记录如下,

"patPar": [{ 
       "recId": 2, 
       "fullname": "Json S Abu Makenzi", 
       "fileId": 1708010001, 
       "parFileId": 1708010002, 
       "sDate": "1999-12-12T00:00:00", 
       "eDate": null, 
      }, { 
       "recId": 3, 
       "fullname": "Sarah S Maz", 
       "fileId": 1708010001, 
       "parFileId": 1708010003, 
       "sDate": "1955-12-14T00:00:00", 
       "eDate": null, 
      }] 

问题,fullname存在的主要模式PatReg但可以通过链接记录,而不是fileId被解读为fileIdfileIdparFileId

换句话说,即使模型中不存在,我如何将fullname的值与其他值一起添加到PatPar中?我需要一个property吗?

澄清更新

我在做基本上有三种选择

首先我选择使用Id 第二PatPar有相关数据从PatReg记录,并得到使用相同的Id

选择我的问题是fullname,我需要将其包含在PatPar中,但使用不同的密钥选择

第三个选择应该parFileIdPatParPatReg

FileID相当于SQL是

第一选择:

SELECT FileId, FName, LName, Dob FROM PatReg Where FileId=id 

第二和第三选择:

SELECT  PatReg.FileId, PatReg.FName, PatReg.MName, PatReg.LName, PatPar.EDate, PatPar.ParFileId, PatPar.SDate, PatReg_1.FName AS PFName, PatReg_1.MName AS PMName, PatReg_1.LName AS PLName 
FROM   PatPar INNER JOIN 
         PatReg ON PatPar.FileId = PatReg.FileId INNER JOIN 
         PatReg AS PatReg_1 ON PatPar.ParFileId = PatReg_1.FileId 

更新

期望JSON是

{ 
    "sdata": { 
     "fileId": 1708010001, 
     "fName": "**", 
     "mName": "**", 
     "lName": "**", 
     "fullname": "***", 
     "dob": "1984-04-26T00:00:00", 
     "patPar": [{ 
       "recId": 2, 
       "fullname": "*****", 
       "fileId": 1708010001, 
       "parFileId": 1708010002, 
       "sDate": "1999-12-12T00:00:00", 
       "eDate": null, 
      }, { 
       "recId": 3, 
       "fullname": "*****", 
       "fileId": 1708010001, 
       "parFileId": 1708010003, 
       "sDate": "1955-12-14T00:00:00", 
       "eDate": null, 
      }] 
    } 
} 

回答

4

它使用的DTO(数据传输对象),以两个端点之间传输数据的好做法。通过这种方式,您可以指定要分享的属性,根据需要编辑模型,并且可以摆脱那些您不会使用的嘈杂属性。在这种情况下,你可以添加一个类象下面这样:

public class PatParDto 

{ 
    public int RecId { get; set; } 
    public int FileId { get; set; } 
    public int ParFileId { get; set; } 
    public DateTime SDate { get; set; } 
    public DateTime? EDate { get; set; } 

    public string FullName {get; set;} 
} 

,然后在你的LINQ查询,你可以选择你的PatPar为PatPatDto:相反

var patRegPar = await _context.PatPar 
      .Where(m => m.FileId == id) 
      .Select(m => new PatParDto { 

      //Here you can set properties 
      FullName = patReg.fullname, 
      RecId = m.RecId 

      }) 
      .ToListAsync(); 

设置属性的手动你可以使用像库AutoMapper

+0

“全名”在'PatReg'存在不'PatPar',为了得到它,声明应该是这样'那里(c.ParFileId == ID)' – JSON

+0

相应的编辑 –

+0

我需要有两个DTO获得如上所示的输出?或者我可以使用DTO来填充'公共ICollection PatPar {get;组; }'PatReg'模型中? – JSON

1

我seggestion是从虚拟财产作出匿名类型,当我们使用相关的表:

var patRegPar = await _context.PatPar // here I get related Records 
     .Include(c=>c.PatReg) 
     .Where(m => m.FileId == id) 
     .Select(t=>new{ recId = t.recId , fullname = t.PatReg.fullname , ... }) 
     .ToListAsync(); 
0

感谢Ege Tuncoz

我加了DTO

public class PatParDto 

{ 
    public int RecId { get; set; } 
    public int FileId { get; set; } 
    public int ParFileId { get; set; } 
    public DateTime SDate { get; set; } 
    public DateTime? EDate { get; set; } 

    public string FullName {get; set;} 
} 

然后在我的控制器我跑了一个循环来添加所需的值在DTO每个记录。

 [HttpGet("{id}")] 
     public async Task<IActionResult> GetPatReg([FromRoute] long id) 
     { 

        if (!ModelState.IsValid) 
        { 
         return BadRequest(ModelState); 
        } 
        var patReg = await _context.PatReg 
         .Where(m => m.FileId == id) 
         .ToListAsync(); 

        var patpar = await _context.PatPar.Select(m => new PatParDto { 
         RecId = m.RecId, 
         FileId = m.FileId, 
         ParFileId = m.ParFileId, 
         SDate = m.SDate, 
         EDate = m.EDate, 
        }).ToListAsync(); 
        for (int i = 0; i < patpar.Count; i++) 

        { 
         patpar[i].FullName = (from a in _context.PatReg 
         where (a.FileId == patpar[i].ParFileId) 
               select new { a.fullname } 
              ).Single().fullname; 

            or 

         patpar[i].FullName = _context.PatReg.Where(a => 
         a.FileId == patpar[i].ParFileId) 
             .Select(t=>new {t.fullname }) 
             .Single().fullname;          

        } 


        if (patReg == null) 
        { 
         return NotFound(); 
        } 

        var DataRes = new { 
         sdata = patReg, 
         test= patpar 
        }; 

        return Ok(DataRes); 
     }