如何使用LINQ / C#[一对多]读取相关数据

时间:2017-08-25 06:03:47

标签: c# entity-framework linq

我有两个相关的表,有一对多的关系,我试图得到一个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);

但是编译器给了我错误,这是怎么做的?

2 个答案:

答案 0 :(得分:2)

您应该使用API代替Where

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>,则需要这样做。

但是,仅当PatParIEnumerable<SomeType>并且您想要SelectMany<PatPar, SomeType>时才适用。

在您的情况下,只能有Select

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