2017-08-25 79 views
0

我有两个相关的表与一对多的关系,我试图得到一个JSON响应,填充ICollection<PatPar> PatPar控制器的代码读取罚款只要我有只有一个相关记录,一旦我有多个相关记录,我会得到一个选择异常。如何阅读相关数据使用LINQ/C#[一对多]

这些都与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); 

但是编译器给我e反应如何?

+0

如果你得到一个编译错误是什么错误? –

+1

'方法enumerable selectmany的类型参数不能从用法中推断' – JSON

回答

2

您应该使用Where代替SelectMany

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

返回'Null',我不能使用'await',因为它不包含GetAwaiter的一个def – JSON

+0

@AhmadAbuMaizar - 请参阅更新 –

+0

@AhmadAbuMaizar - 以及肯定上面的行不返回null。也许一个空的集合,但不是null –

2

也许你真的想这样:

IEnumerable<PatPar> parinfo = _context.PatPar.Where(m => m.FileId == id); 

SelectMany描述:

项目序列的每个元素添加到IEnumerable和将产生的序列变平成一个序列。

所以,如果你想得到IEnumerable<SomeSpecificField>的结果是必要的。

但是,它仅适用于PatParIEnumerable<SomeType>而您想要SelectMany<PatPar, SomeType>

你的情况只能有Select

IEnumerable<Int64> parFileIds = _context.PatPar.Select(m => m.ParFileId); 
+0

同样的错误'方法enumerable selectmany的类型参数不能从使用中推断出来 – JSON

+1

第二个选项仍然无效 –