FirstOrDefault使用错误的重载,应调用IQueryable的扩展名,但应调用IEnumerable

时间:2018-11-08 11:39:38

标签: c# entity-framework linq lambda

我有一个问题,我为dbContext创建了一个简单的包装程序,它的工作方式类似于存储库模式,可能会与程序的其余部分失去联系。

在此存储库中,我制作了如下方法:

    public TwrKarty FirstOrDefault(Func<TwrKarty, bool> predicate)
    {
        return _dbContext.TwrKarty.FirstOrDefault(predicate);
    }

TwrKary是普通的DbSet

public class ErpXlDbContext : DbContext
{
    public ErpXlDbContext() :base("name=Something")
    {
        this.Configuration.LazyLoadingEnabled = false;
        Database.CommandTimeout = 180;
    }

    public DbSet<TwrKarty> TwrKarty { get; set; }
    public DbSet<TwrCeny> TwrCeny { get; set; }
}

我的问题是,当我从存储库中调用FirstOrDefault方法时,它随后会调用dbContext的FirstOrDefault方法,但是它没有使用IQueryable扩展方法,而是使用IEnumerable扩展方法,这导致性能下降,因为必须下载来自TwrKarty DbSet的所有数据,完成后会过滤掉您在谓词中要求的数据。

为什么会这样?有没有办法强迫我使用IQueryable扩展名?

当我尝试直接调用DbSet的方法,并且以lambda表达式(而不是Func)形式输入参数时,它将按预期工作...

0 个答案:

没有答案