[英]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.