C#中如何在类构造函数内执行返回匿名对象的LINQ查询
你当前写法报错的根本原因是Select语句返回的是运行时生成的匿名类型,无法直接隐式转换为你声明的IList<Response>类型,可通过以下两种方案解决:
方案1:直接映射到EF实体类
如果你的Response实体类已经包含ResponseId、SegmentId、Response1、ResponseDescription、ResponseGuidance这几个属性,只需要把Select中的匿名类改为显式创建Response实例即可:
ResponseCCTtoAuditResponse = _cctDBContext.Response .Select(b => new Response { ResponseId = b.ResponseId, SegmentId = b.SegmentId, Response1 = b.Response1, ResponseDescription = b.ResponseDescription, ResponseGuidance = b.ResponseGuidance }) .Where(b => b.SegmentId == 5) .ToList();
注意:如果实体类还有其他必填非空属性,要么在
Select里一起赋值,要么确保数据库对应字段有默认值,避免EF映射报错。
方案2:自定义DTO类承接查询结果
如果你只需要这几个字段、不想带实体类的多余属性,更推荐自定义专属的数据传输类:
- 首先定义DTO类:
public class AuditResponseDto { public int ResponseId { get; set; } public int SegmentId { get; set; } public string Response1 { get; set; } public string ResponseDescription { get; set; } public string ResponseGuidance { get; set; } }
- 修改
SegmentData类的字段声明和查询逻辑:
// 把泛型参数从Response改为自定义的AuditResponseDto private readonly IList<AuditResponseDto> ResponseCCTtoAuditResponse; // 构造函数内的查询修改为 ResponseCCTtoAuditResponse = _cctDBContext.Response .Select(b => new AuditResponseDto { ResponseId = b.ResponseId, SegmentId = b.SegmentId, Response1 = b.Response1, ResponseDescription = b.ResponseDescription, ResponseGuidance = b.ResponseGuidance }) .Where(b => b.SegmentId == 5) .ToList();
以上两种方案都可以直接在构造函数中执行,EF会在你调用ToList()时立即执行查询,符合你要把查询提前放到构造函数里运行的需求。
内容的提问来源于stack exchange,提问作者Jason_Hough
相关产品推荐
相关产品推荐

