Linq报错CS1579:无法遍历匿名类型变量求解决方向
问题分析与解决
你这里的问题核心很清晰:FirstOrDefault()返回的是单个匿名类型对象(要么是查询结果的第一条数据,要么是null),而foreach语句只能遍历实现了IEnumerable接口的集合类,单个对象没有GetEnumerator()方法,所以触发了CS1579错误。
下面分两种场景给出解决方案:
场景1:仅需获取第一条匹配的记录
直接移除foreach循环,直接访问单个对象的属性即可:
var results1 = (from p in db1.a_PCRs join je in db1.a_Job_Extensions on p.PCR equals je.PCR join j in db1.Jobs on je.Job equals j.Job1 join d in db1.Deliveries on j.Job1 equals d.Job where j.Status == "Active" where j.Job1.StartsWith("A") where p.PCR == "2552" where d.Shipped_Quantity > 0 orderby d.Shipped_Date descending select new { p.PCR, d.Shipped_Date }).FirstOrDefault(); if (results1 != null) { lastDeliveryDate = results1.Shipped_Date; }else { lastDeliveryDate = Convert.ToDateTime("1/1/1980"); }
注:因为你已经按Shipped_Date倒序排序,第一条就是最新的发货日期,完全不需要遍历。
场景2:需要获取所有匹配的记录并遍历
把FirstOrDefault()替换为ToList()(或ToArray()),将查询结果转为集合类型,即可正常使用foreach:
var results1 = (from p in db1.a_PCRs join je in db1.a_Job_Extensions on p.PCR equals je.PCR join j in db1.Jobs on je.Job equals j.Job1 join d in db1.Deliveries on j.Job1 equals d.Job where j.Status == "Active" where j.Job1.StartsWith("A") where p.PCR == "2552" where d.Shipped_Quantity > 0 orderby d.Shipped_Date descending select new { p.PCR, d.Shipped_Date }).ToList(); if (results1.Any()) { foreach (var result1 in results1) { lastDeliveryDate = result1.Shipped_Date; // 注意:遍历多条记录时,lastDeliveryDate会被最后一条覆盖,按需调整逻辑 } }else { lastDeliveryDate = Convert.ToDateTime("1/1/1980"); }
内容的提问来源于stack exchange,提问作者Bernie Hunt
相关产品推荐
相关产品推荐

