C# 使用匿名返回列表时Linq查询出错
我有下面的linq查询,其中我想以列表的形式返回每个StatusType的总数C# 使用匿名返回列表时Linq查询出错,c#,linq,C#,Linq,我有下面的linq查询,其中我想以列表的形式返回每个StatusType的总数 public async Task<ServiceResponse<IList<(StatusType StatusType, int Count)>>> GetSummaryByStatusTypeAsync() { Func<Task<IList<(StatusType StatusType, int Count)>>
public async Task<ServiceResponse<IList<(StatusType StatusType, int Count)>>> GetSummaryByStatusTypeAsync()
{
Func<Task<IList<(StatusType StatusType, int Count)>>> func = async () =>
{
using (var context = _contextFactory())
{
var items = (await context.ToListAsync<Job>(x => x
.Include(y => y.Status)))
.GroupBy(x => x.Status.StatusType)
.Select(x => new
{
StatusType = x.Key,
Count = x.Count()
}).ToList();
return items;
}
};
return await this.ExecuteAsync(func);
}
公共异步任务GetSummaryByStatusTypeAsync()
{
Func Func=async()=>
{
使用(var context=_contextFactory())
{
var items=(wait context.ToListAsync(x=>x
.包括(y=>y.Status)))
.GroupBy(x=>x.Status.StatusType)
.选择(x=>new
{
StatusType=x.键,
Count=x.Count()
}).ToList();
退货项目;
}
};
返回等待此消息。ExecuteAsync(func);
}
然而,我得到了错误
CS0266无法隐式转换类型
“System.Collections.Generic.List”到
'System.Collections.Generic.IList'。存在显式转换(是否缺少强制转换?)
CS4010无法将异步lambda表达式转换为委托类型
“任务”。异步lambda
表达式可以返回void、Task或Task,它们都不是空的
可转换为“任务”
您的函数返回类型不是匿名的。这是元组。 您可以这样做:
var items = (await context.ToListAsync<Job>(x => x
.Include(y => y.Status)))
.GroupBy(x => x.Status.StatusType)
.AsEnumerable()
.Select(x => (x.Key, x.Count()))
.ToList();
return items;
var items=(wait context.ToListAsync(x=>x
.包括(y=>y.Status)))
.GroupBy(x=>x.Status.StatusType)
.可计算的()
.选择(x=>(x.Key,x.Count())
.ToList();
退货项目;
您的函数返回类型不是匿名的。这是元组。
您可以这样做:
var items = (await context.ToListAsync<Job>(x => x
.Include(y => y.Status)))
.GroupBy(x => x.Status.StatusType)
.AsEnumerable()
.Select(x => (x.Key, x.Count()))
.ToList();
return items;
var items=(wait context.ToListAsync(x=>x
.包括(y=>y.Status)))
.GroupBy(x=>x.Status.StatusType)
.可计算的()
.选择(x=>(x.Key,x.Count())
.ToList();
退货项目;
错误非常明确,当函数需要一个元组时,您试图返回一个匿名类型。在Select()
中,您使用的是匿名类型,而方法签名声称您需要返回一个ValueTuple
。改用x=>(x.Key,x.Count())
。我也不明白为什么要创建这个内联Func
,这真的很奇怪。LINQ没有异步操作,或者包含。你用的是efcore吗?DbContext没有ToListSync,也不需要它——它是非常特定实体的工作单元,而不是数据库模型或连接。问题的原因隐藏在您尚未发布的方法中,例如ExecuteAsync
,即ToListAsync
和\u contextFactory
@Heinzi,您是对的。已修复。错误非常明确,当函数需要元组时,您试图返回匿名类型。在Select()
中,您使用的是匿名类型,而方法签名声明您需要返回ValueTuple
。改用x=>(x.Key,x.Count())
。我也不明白为什么要创建这个内联Func
,这真的很奇怪。LINQ没有异步操作,或者包含。你用的是efcore吗?DbContext没有ToListSync,也不需要它——它是非常特定实体的工作单元,而不是数据库模型或连接。问题的原因隐藏在您尚未发布的方法中,例如ExecuteAsync
,即ToListAsync
和\u contextFactory
@Heinzi,您是对的。修正。@haim770谢谢。我不知道我们可以忽略Linq中的“newtuple”关键字。我刚知道。下次我需要的时候我会试试。这是C#7.0的功能:@haim770我就知道。。。我不知道为什么我认为在林克就像过去一样:)。其他地方我都像你写的那样使用它。另外,正如@Heinzi所指出的,当使用新语法时,它实际上发出了ValueTuple
(以避免额外的分配)。谢谢大家的帮助,效果很好。看不见树林。@haim770谢谢。我不知道我们可以忽略Linq中的“newtuple”关键字。我刚知道。下次我需要的时候我会试试。这是C#7.0的功能:@haim770我就知道。。。我不知道为什么我认为在林克就像过去一样:)。其他地方我都像你写的那样使用它。另外,正如@Heinzi所指出的,当使用新语法时,它实际上发出了ValueTuple
(以避免额外的分配)。谢谢大家的帮助,效果很好。看不见树林,看不见树木。