Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用匿名返回列表时Linq查询出错_C#_Linq - Fatal编程技术网

C# 使用匿名返回列表时Linq查询出错

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)>>

我有下面的linq查询,其中我想以列表的形式返回每个StatusType的总数

    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
(以避免额外的分配)。谢谢大家的帮助,效果很好。看不见树林,看不见树木。