C# 如何使用EF组合来自两个相关模型的相关数据?

C# 如何使用EF组合来自两个相关模型的相关数据?,c#,json,entity-framework,C#,Json,Entity Framework,概念 我有两个模型,它们在一对多关系中是相关的。第一个模型基本上存储患者信息(PatReg)。第二个模型将合作伙伴连接在一起(PatPar)。 i、 e.(FileId=1 Sam,FileId=2 Victoria,FileId=3 jessica,FileId=4 monica)信息都存储在PatReg中。为了说山姆是维多利亚和杰西卡的合伙人,我加入了PatPar的行列,方式如下: FileId= 1 FileId=2 FileId= 1 FileId=3 以下说明这两种模式 pu

概念

我有两个模型,它们在一对多关系中是相关的。第一个模型基本上存储患者信息(
PatReg
)。第二个模型将合作伙伴连接在一起(
PatPar
)。 i、 e.(FileId=1 Sam,FileId=2 Victoria,FileId=3 jessica,FileId=4 monica)信息都存储在
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; }
    }
结果
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,
        }]
    }
}
我希望
patPar
列表的
JSON
输出对于每条记录如下所示

"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
fileId
fileId
parFileId
来读取

换句话说,我如何在
PatPar
中添加
fullname
值以及其他值,即使它在模型中不存在?我需要一个
属性吗

澄清更新

我基本上做了三个选择

首先,我使用
Id
PatReg
中选择记录 第二个
PatPar
具有相关数据,并且使用相同的
Id

我的问题是
全名
,我需要将其包含在PatPar中,但使用不同的键选择

第三个选择应该是
PatPar
中的
parFileId
PatReg
中的
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
第二和第三选择:

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,
            }]
    }
}

使用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();

您可以使用类似于

的库,而不是手动设置属性。最好使用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();

您可以使用类似于

的库,而不是手动设置属性。我的分类是在使用相关表时,从虚拟属性创建匿名类型:

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();

我的建议是在使用相关表时,从虚拟财产创建匿名类型:

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();
谢谢

我添加了
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);
         }
[HttpGet(“{id}”)]
公共异步任务GetPatReg([FromRoute]长id)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
var patReg=wait_context.patReg
.Where(m=>m.FileId==id)
.ToListAsync();
var patpar=wait_context.patpar.Select(m=>newpatpardto{
RecId=m.RecId,
FileId=m.FileId,
ParFileId=m.ParFileId,
SDate=m.SDate,
EDate=m.EDate,
}).ToListAsync();
对于(int i=0;i
a、 FileId==patpar[i].ParFileId)
.Select(t=>new{t.fullname})
.Single().fullname;
}
如果(patReg==null)
{
返回NotFound();
}
var DataRes=新{
sdata=patReg,
测试=patpar
};
返回Ok(数据存储);
}
谢谢

我添加了
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);
         }
[HttpGet(“{id}”)]
公共异步任务GetPatReg([FromRoute]长id)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
var patReg=wait_context.patReg
.Where(m=>m.FileId==id)
.ToListAsync();
var patpar=wait_context.patpar.Select(m=>newpatpardto{
RecId=m.RecId,
FileId=m.FileId,
ParFileId=m.ParFileId,
SDate=m.SDate,
EDate=m.EDate,
}).ToListAsync();
对于(int i=0;i