ASP.NET MVC LINQ查询报错:字符串与HolidayRequestForm无法比较求解决
解决LINQ查询中的类型不匹配错误
首先,咱们来拆解一下你遇到的错误:Operator '==' cannot be applied to operands of type 'string' and 'HolidayTracker.Models.HolidayRequestForm'。这个错误的根源非常明确——你在第二个查询里写了r.Employee.Site.SiteName == employeesSU.FirstOrDefault(),左边的SiteName是字符串类型,而employeesSU.FirstOrDefault()返回的是一个HolidayRequestForm对象,这两个类型完全不兼容,自然没法用==做比较。
你的需求分析
从代码逻辑来看,你应该是想先筛选出符合指定站点(或所有站点,如果searchSitehols为空)的假期申请记录,再对这些记录按假期月份分组,统计每个月的总休假时长。那正确的思路应该是基于第一个筛选后的结果进行分组统计,而不是重新从数据库查询并做错误的类型对比。
修正后的代码方案
这里提供两种合理的写法,你可以根据场景选择:
方案1:直接复用筛选后的查询结果(推荐)
这种方式更高效,因为它会把两个查询合并为一次数据库请求:
// 第一步:筛选符合条件的假期申请 var employeesSU = from s in db.HolidayRequestForms where string.IsNullOrEmpty(searchSitehols) || s.Employee.Site.SiteName == searchSitehols select s; // 第二步:基于筛选后的结果分组统计 var querythpmpro = from r in employeesSU group r by r.MonthOfHoliday into g select new { Value = g.Key, Count = g.Sum(h => h.HoursTaken) } into result orderby result.Value select result;
方案2:单独复用筛选条件(不推荐,会重复执行筛选逻辑)
如果你一定要在第二个查询里单独写筛选逻辑,那应该和第一个查询的条件保持一致,而不是去对比HolidayRequestForm对象:
var querythpmpro = from r in db.HolidayRequestForms where string.IsNullOrEmpty(searchSitehols) || r.Employee.Site.SiteName == searchSitehols group r by r.MonthOfHoliday into g select new { Value = g.Key, Count = g.Sum(h => h.HoursTaken) } into result orderby result.Value select result;
额外优化建议
- 把
searchSitehols == null || searchSitehols == ""替换成string.IsNullOrEmpty(searchSitehols),代码更简洁规范。 - 如果
employeesSU后续会被多次调用,可以考虑添加.ToList()把结果加载到内存;但如果只是用于本次分组统计,保持IQueryable状态让数据库端处理会更高效。
内容的提问来源于stack exchange,提问作者Conor8630
相关产品推荐
相关产品推荐

