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

问题描述 投票:0回答:5

根据 switch/case,变量被设置为 EF 链。 但我不知道如何定义变量groupByLeadIdQuery

IQueryable groupByLeadIdQuery = null;

switch (...)
{
    case ...:
    {
         groupByLeadIdQuery = context.HistoryRecords.GroupBy(h => h.ProductId)
         .Select(g => new
         {
              Id = g.Key,
              Retributions = g.Sum(s => s.Retribution),
         });
    }
    break;
    case ...:
    {
        groupByLeadIdQuery = 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;

没有任何作用。

你能告诉我这个吗?

感谢您的帮助

c# asp.net-core
5个回答
1
投票

来自王王

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

就像魅力一样


0
投票

对于 ToList 方法,您应该将 IQueryable 变量定义为 List。例如

IQueryable<Product>
或类似的东西。如果没有特定类型,您可以仅使用 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;
}
...
}

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


0
投票

切换表达式可能是一个不错的选择。根本问题是你需要

<T>
中的
IQueryable<T>
,但它是“不可发音的”,所以你只能使用
var
来声明这样的,但是:

var query = whatever switch {
    SomeCase => your.Query.Here...,
    _ => null,
};

请注意,虽然您可以根据需要拥有任意数量的案例行,但它们必须具有相同的形状才能正常工作。


0
投票

您可以制作通用的

Group By
方法,如下所示:

 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;
        }

它可以用于您的任何实体。


0
投票

我一直在使用并且效果很好的是:

IQueryable groupByLeadIdQuery = null;

我希望它也适合你。

© www.soinside.com 2019 - 2024. All rights reserved.