首页 > 解决方案 > C#如何用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;
    }
    ...
}

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

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

解决方案


要拥有 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;
}
...
}

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


推荐阅读