根据 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;
没有任何作用。
你能告诉我这个吗?
感谢您的帮助
来自王王
groupByLeadIdQuery2.Cast<dynamic>().ToList()
就像魅力一样
对于 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;
}
...
}
如果这不能解决您的问题,您应该使用接口,一个包含您需要的属性的接口,或者可能是动态接口。
切换表达式可能是一个不错的选择。根本问题是你需要
<T>
中的IQueryable<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;
}
它可以用于您的任何实体。
我一直在使用并且效果很好的是:
IQueryable groupByLeadIdQuery = null;
我希望它也适合你。