LINQ错误:GroupBy选择上出现System.NotSupportedException

时间:2018-10-03 05:01:46

标签: c# .net linq

var items = q3.ToList();从下面的代码片段执行时,它将引发异常System.NotSupportedException。目的是在分组后获得items的列表。

例外: Unable to create a constant value of type 'AppDB.Stage.Rules'. Only primitive types or enumeration types are supported in this context.

  var valuations = context.stage
                .Where(q => q.stageID == stageID && !rules.ToList().Any(r => r.type1 == q.type1 || r.type2 == q.type2))
               .GroupBy(q => q.stageKey)
               .Select(g => g) ;

            var q3 = valuations.Select(y => new StageType
            {
                TypeKey = y.Key,
                TypeName= "UNKNOWN",
            });
            var items = q3.ToList(); //error here

2 个答案:

答案 0 :(得分:5)

您的数据库不知道您的内存<ul> {audits.map(item => ( <li key={item.crg_buildingid}> <b>Building Name</b>: {item.crgName} |<b>Start Date</b>: {item.crgStarteddatetime} | </li> )} </ul> 实际是什么,因此无法将该语句转换为SQL

最简单的解决方案是将其保留为rules,而不使用IQueriable

ToList

但是,如果它已经在内存中,那么您将必须将这些值作为原始列表发送

context.stage
       .Where(q => q.stageID == stageID && !rules.Any(r => r.type1 == q.type1 || r.type2 == q.type2))
       .GroupBy(q => q.stageKey)
       .Select(g => g) ;

答案 1 :(得分:0)

因为rules.ToList()在内存中产生结果,所以不能在通过SQL执行的IQueriable中使用它。您应该先将数据放入内存,然后再通过其他内存中对象缩小数据范围。

 var valuations = context.stage.ToList()
                .Where(q => q.stageID == stageID && !rules.ToList().Any(r => r.type1 == q.type1 || r.type2 == q.type2))
               .GroupBy(q => q.stageKey)
               .Select(g => g) ;

            var q3 = valuations.Select(y => new StageType
            {
                TypeKey = y.Key,
                TypeName= "UNKNOWN",
            });
            var items = q3.ToList();