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