我有两个相关的表,有一对多的关系,我试图得到一个JSON
响应填充ICollection<PatPar> PatPar
下面的控制器代码只要我只有一个相关记录就可以读取,一次我有一个以上的相关记录,我得到一个选择异常。
这些是相关的Models
public class PatReg
{
[NotMapped]
private Int64 _FileId;
[Key, Display(Name = "File Id"), ScaffoldColumn(false), DatabaseGenerated(DatabaseGeneratedOption.None)]
public Int64 FileId
{
get
{
return this._FileId;
}
set
{
this._FileId = value;
}
}
[Required, Display(Name = "First Name")]
public string FName { 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]
public IEnumerable<PatReg> GetPatReg()
{
return _context.PatReg;
}
[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);
var parinfo = await _context.PatPar.SingleOrDefaultAsync(m => m.FileId == id); // I should select many records here
if (patReg == null)
{
return NotFound();
}
var DataRes = new {
sData = patReg
};
return Ok(DataRes);
}
我知道我应该使用selectMany
而不是SingleOrDefaultAsync
,所以我尝试了
IEnumerable<PatPar> parinfo = await _context.PatPar.SelectMany(m => m.FileId == id);
但是编译器给了我错误,这是怎么做的?
答案 0 :(得分:2)
var result = _context.PatPar.Where(m => m.FileId == id);
SelectMany
用于从迭代集合的每个项中检索集合。但是你的条件是检查FileId
是否等于某些id
- 结果类型是一个布尔值。我假设你要做的是返回所有FileId
。
使用await
:
var result = await _context.PatPar.Where(m => m.FileId == id).ToListAsync();
答案 1 :(得分:2)
也许你真的想要这个:
IEnumerable<PatPar> parinfo = _context.PatPar.Where(m => m.FileId == id);
SelectMany
说明:
将序列的每个元素投影到IEnumerable并展平 得到的序列成一个序列。
因此,如果您希望获得IEnumerable<SomeSpecificField>
,则需要这样做。
但是,仅当PatPar
有IEnumerable<SomeType>
并且您想要SelectMany<PatPar, SomeType>
时才适用。
在您的情况下,只能有Select
IEnumerable<Int64> parFileIds = _context.PatPar.Select(m => m.ParFileId );