C# C如何用IQueryable定义匿名类型?

C# C如何用IQueryable定义匿名类型?,c#,asp.net-core,C#,Asp.net Core,根据开关/情况,变量设置为EF链接。 但是我不知道如何定义变量groupbyleaddquery 在代码的后面,我将根据变量是否为null来处理结果 if (groupByLeadIdQuery2 != null) { var list = groupByLeadIdQuery2.ToList(); <<<<<<<<<<<<<<<<<< ... } 编译器抱怨:IQuer

根据开关/情况,变量设置为EF链接。 但是我不知道如何定义变量groupbyleaddquery

在代码的后面,我将根据变量是否为null来处理结果

if (groupByLeadIdQuery2 != null)
{
    var list = groupByLeadIdQuery2.ToList(); <<<<<<<<<<<<<<<<<<
    ...
}
编译器抱怨:IQueryable不包含ToList的定义

我试过了

IQueryable<T> groupByLeadIdQuery = null;
IQueryable<Anonymous> groupByLeadIdQuery = null;
IQueryable<'a> groupByLeadIdQuery = null;
var groupByLeadIdQuery = null;
什么都不管用

你能告诉我这件事吗


感谢您的帮助

使用ToList方法,您应该将IQueryable变量定义为List。例如IQueryable或类似的东西。如果没有特定的类型,您可以只使用var并获取您的匿名类型

在您的情况下,我认为最简单的解决方案是设置一个默认值,而不是按案例更新。但在这种情况下,必须为每个案例设置相同的匿名类型,否则必须强制转换类型

 var groupByLeadIdQuery = context.HistoryRecords.GroupBy(h => h.ProductId)
     .Select(g => new
     {
          Id = g.Key,
          Retributions = g.Sum(s => s.Retribution),
     });
switch (...)
{
case ...:
{
     groupByLeadIdQuery = ...;
}
break;
case ...:
{
    groupByLeadIdQuery = null;
}
...
}

如果这不能解决您的问题,您应该使用接口,一个包含您需要的属性的接口,或者可能是动态接口。

切换表达式可能是一个很好的选择。基本问题是您需要in-IQueryable,但它是不可命名的,因此您只能使用var来声明,但是:

var query=任何开关{ SomeCase=>your.Query.Here。。。, _=>空, }; 请注意,虽然您可以根据需要使用任意多的案例行,但它们必须具有相同的形状才能正常工作。

您可以使用以下方法创建generic Group By method:

 public async Task<List<T>> GetGroupByResult<T>(string groupByItem) where T : class
        {
            var groupByLeadIdQuery = _dbContext.Set<T>();

            switch (groupByItem)
            {
                case "ProductId":
                {
                        groupByLeadIdQuery = groupByLeadIdQuery.GroupBy(h => h.ProductId)
                            .Select(g => new
                            {
                                Id = g.Key,
                                Retributions = g.Sum(s => s.Retribution),
                            });

                        break;
                }
                case "Other":
                {
                    groupByLeadIdQuery = ...;

                    break;
                }
                default:
                    {
                        groupByLeadIdQuery = null;
                    }
            }

            if (groupByLeadIdQuery != null)
                return await groupByLeadIdQuery.ToListAsync();

            return default;
        }
它可以用于您的任何实体。

来自King

groupByLeadIdQuery2.Cast<dynamic>().ToList() 

就像一个符咒一样工作

我们不能使用匿名类型?我不能像在代码中那样使用var,因为变量的外部作用域更大。你可以像我在代码中那样使用匿名类型。变量定义的作用域应高于或等于重新分配变量的作用域。简单的方法如GroupByReadyQuery2.Cast.ToList或GroupByReadyQuery2.Cast.ToList,也可以为临时结果声明显式类型。没有必要涉及匿名类型创建。哦,是的,很好,它工作得很好,谢谢
groupByLeadIdQuery2.Cast<dynamic>().ToList()