C# 无法强制转换类型'System.Linq.IGrouping`2[[System.Decimal]
在我的webApi2服务中,我使用实体框架作为orm,Linq作为查询语言后端作为azure sql。 我的DTO类来映射我的查询结果C# 无法强制转换类型'System.Linq.IGrouping`2[[System.Decimal],c#,entity-framework,linq,azure,azure-sql-database,C#,Entity Framework,Linq,Azure,Azure Sql Database,在我的webApi2服务中,我使用实体框架作为orm,Linq作为查询语言后端作为azure sql。 我的DTO类来映射我的查询结果 public class RTLSLevelZonesInfoDTO { public List<int> L1 { get; set; } public List<int> L2 { get; set; } public List<int> L3 { get; set; } public R
public class RTLSLevelZonesInfoDTO
{
public List<int> L1 { get; set; }
public List<int> L2 { get; set; }
public List<int> L3 { get; set; }
public RTLSLevelZonesInfoDTO()
{
L1 = new List<int>();
L2 = new List<int>();
L3 = new List<int>();
}
}
我的查询用于填充数据
var leveZones = (from s in db.RTLS_SpotLevelMap
group s by s.Level_no
into g
select new RTLSLevelZonesInfoDTO
{
L1 = (g.Key == 1) ? (List<int>)g: convertedLocationArray,
L2 = (g.Key == 2) ? (List<int>)g : convertedLocationArray,
L3 = (g.Key == 3) ? (List<int>)g : convertedLocationArray
}).FirstOrDefault();
上面的查询获取属于特定级别的ZoneID,在我的数据库中只有3个固定级别,如下图所示
在执行代码后,我被捕获到一个异常,消息是
无法强制转换类型“System.Linq.IgGrouping2[[System.Decimal,
mscorlib,版本=4.0.0.0,区域性=中性,
PublicKeyToken=b77a5c561934e089],[RTLSWebService.Models.RTLS\u DB.RTLS\u SpotLevelMap,
RTLSWebService,版本=1.0.0.0,区域性=中性,
PublicKeyToken=null]]”以键入
'System.Collections.Generic.List`1[[System.Int32,mscorlib,
Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]'。
LINQ to实体仅支持强制转换EDM基元或枚举
类型
试着这样做:
var leveZones = (from s in db.RTLS_SpotLevelMap
group s by s.Level_no
into g
select new RTLSLevelZonesInfoDTO
{
L1 = (g.Key == 1) ? g.ToList(): convertedLocationArray,
L2 = (g.Key == 2) ? g.ToList() : convertedLocationArray,
L3 = (g.Key == 3) ? g.ToList() : convertedLocationArray
}).FirstOrDefault();
最后,我通过对每个列表进行单独查询得到了解决方案
var levelZones = new RTLSLevelZonesInfoDTO();
var l1 = await ((db.RTLS_SpotLevelMap.Where(p => p.Level_no == 1)).Select(q => (int)q.zone_id)).ToListAsync();
var l2 = await ((db.RTLS_SpotLevelMap.Where(p => p.Level_no == 2)).Select(q => (int)q.zone_id)).ToListAsync();
var l3 = await ((db.RTLS_SpotLevelMap.Where(p => p.Level_no == 3)).Select(q => (int)q.zone_id)).ToListAsync();
levelZones.L1 = l1;
levelZones.L2 = l2;
levelZones.L3 = l3;
这个怎么样
var lookup = db.RTLS_SpotLevelMap.ToLookup(s => s.Level_no, s => s.ZoneId);
new RTLSLevelZonesInfoDTO
{
L1 = lookup[1].ToList(),
L2 = lookup[2].ToList(),
L3 = lookup[3].ToList()
};
g属于IGrouping类型,您试图将其强制转换为List,错误是不言而喻的。您不了解错误的哪一部分?g属于IGrouping类型。您可能只需要元素,所以只需添加.ToList之类的内容即可摆脱键并将其转换为List。还有一件事:您可能需要重新考虑da中的数据类型tabase.Decimal似乎不适用于ID。向下投票人,请指定向下投票的原因。我已经尝试过它,它给出了编译时错误,因为无法确定条件表达式的类型,因为…之间没有隐式转换。什么是:convertedLocationArray?什么是RTLS_SpotLevelMap的架构?convertedLocationArray是空的y数组和RTLS_SpotLevelMap模式是创建表RTLS_SpotLevelMapzone_id numeric10不为空,Level_no numeric3不为空感谢您的帮助@Piotr我已经通过另一种方法完成了。没问题。我很高兴您成功了;