繁体   English   中英

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

[英]C# how to define an anonymous type with IQueryable?

根据开关/情况,变量设置为 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;
    }
    ...
}

稍后在代码中,我根据变量是否为 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<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;
}
...
}

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

切换表达式在这里可能是一个不错的选择。 根本问题是您需要IQueryable<T> <T>中的 <T> ,但它是“不可发音的”,因此您只能使用var来声明它,但是:

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

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

您可以使通用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;
        }

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

来自大王

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

奇迹般有效

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM