EF Core中LINQ查询返回的IQueryable对象无法访问字段属性怎么解决
问题排查与修复方案
错误根本原因
你定义的settings_data是IQueryable<Setting>集合类型,哪怕调用Take(1),返回的仍然是最多包含1个元素的查询集合,不是单个Setting实体对象,因此无法直接访问集合上不存在的StartTime属性。
另外你当前直接将IQueryable对象存入缓存的逻辑也存在隐患:IQueryable本身只保存查询定义,不包含实际查询结果,后续从缓存取出使用时,关联的DbContext大概率已经被释放,会触发上下文已释放的运行时错误。
修复代码
直接调整变量类型为单个Setting实体,查询时立刻执行拿到结果再存入缓存即可,修正后代码如下:
public class CustomersController : Controller { // ............ // 变量改为单个Setting实体类型 JAXSurplusMouseApp.Models.Setting settings_data = null; // ..................... bool isSettingExist = memoryCache.TryGetValue("SMSettings", out settings_data); if (!isSettingExist) { string myCondition = (todayDt.DayOfWeek.ToString().Substring(0, 3)).ToUpper(); // 执行查询拿到第一个符合条件的实体,无匹配数据返回null settings_data = (from s in _context.Settings where s.OrderDay == myCondition select s).FirstOrDefault(); var cacheEntryOptions = new MemoryCacheEntryOptions() .SetSlidingExpiration(TimeSpan.FromHours(2)); memoryCache.Set("SMSettings", settings_data, cacheEntryOptions); } // 非空判断后直接访问属性即可 if(settings_data != null) { string start_time = settings_data.StartTime; } }
另外你原有代码中stringstart_time存在语法错误,缺少空格,修正为string start_time即可。
内容的提问来源于stack exchange,提问作者user4912134
相关产品推荐
相关产品推荐

