所以我有一个具有定义的属性EFCore.DBSet<AccessTime> AccessTime的上下文类EFCoreMContext

public class EFCoreMContext : Microsoft.EntityFrameworkCore.DbContext
{
    public Microsoft.EntityFrameworkCore.DbSet<User> Users { get; set; }
    public Microsoft.EntityFrameworkCore.DbSet<AccessTime> AccessTime { get; set; }
    ...
}

然后我有一个存储库类CAccessTimeRepository

public class CAccessTimeRepository : IRepository<AccessTime>
{
    private EFCoreMContext db;

    public CAccessTimeRepository(EFCoreMContext context)
    {
        this.db = context;
    }
    ...

使用异步功能:

    public async Task<IEnumerable<AccessTime>> FindAsync(Func<AccessTime, bool> predicate)
    {
        return await db.AccessTime.Where(predicate).ToListAsync();
    }
    ...
}

问题是,当我try 使用这个ToListAsync()时-Visual Studio突出显示了它,但出现错误

CS1061 IEnumerable不包含ToListAsync()

问题是,当我用.Where()英镑买这样的东西时

.Where(x => x.ID == 1)

它返回IQueryable,所以我可以使用ToListAsync().但是,当我将此方法与我的谓词一起使用时,它返回IEnumerable.

所以我试着用AsQueryable来传递这个代码

public async Task<IEnumerable<AccessTime>> FindAsync(Func<AccessTime, bool> predicate)
{
    return await db.AccessTime
                   .Where(predicate)
                   .AsQueryable()
                   .ToListAsync();
}

在执行此代码时,我收到一个错误:

源‘Iqueryable’不实现‘IAsyncEnumerable&lt;_3TierApp.DAL.Entities.AccessTime&gt;’.只有实现了"IAsyncEnumerable"的源才能用于实体框架异步操作.

我不知道为什么带谓词的.Where()with x => x.Id返回不同的类型.

有谁能解释一下吗?还有,对此最好的解决方案是什么?

推荐答案

EF Core类似EntityFrameworkQueryableExtensions.ToListAsync的扩展与IQueryable接口一起工作(查看链接的方法签名),而不是IEnumerableIQueryable需要Expression<Func<...>>(例如Queryable.Where)而不仅仅是Func<...>(它允许分析传递的表达式树并生成SQL查询),因此相应地更改签名:

public async Task<IEnumerable<AccessTime>> FindAsync(
     Expression<Func<AccessTime, bool>> predicate)
{
    return await db.AccessTime
         .Where(predicate)
         .ToListAsync();
}

阅读更多内容:

Csharp相关问答推荐

在Linq中调用需要limit和offset的方法''''

C#自定义字典与JSON(de—)serialize

如何使datagridview的列具有响应性,以便不是所有列都更改其宽度

在路由中使用枚举

使用带有WithAppOnly()请求选项的pageIterator

应用程序重新启动后,EFCore列表的BSON反序列化错误

C#-从基类更新子类

集合表达式没有目标类型

Regex字母数字校验

C#按名称从类获取属性值类型<;t>;,我需要反射吗?

如何强制新设置在Unity中工作?

如何从Entity Framework Core中填充ListIInterface

在C#中,当输入一个方法/局部函数时,我的IEnumerator被重置/重新创建.为什么?

如何在C#.NET桌面应用程序中动态更改焦点工具上的后退 colored颜色

除非首先访问使用的终结点,否则本地API上的终结点不起作用

分别切换用于读取和写入的EF核心日志(log)

在c#中,使用Okta和Blazor时,LocalReDirect()陷入循环,出现错误&请求太多.

方法加载时出现类型加载异常

C#二进制PowerShell模块类型转换

具有双返回类型的多路委托,仅返回最后一个方法';S结果,而不是所有方法';S结果