EF上下文.设置<;T>;()方法

本文关键字:方法 gt 上下文 lt EF 设置 | 更新日期: 2023-09-27 18:00:10

我想获得具有条件的数据,如.中的lambda表达式

public IEnumerable<T> GetBy(Func<T, bool> condition)
    {
        var test = Context.Set<StateInfo>().Where(p => p.CustomerID != null && p.CustomerID == 5);
        var test2= Context.Set<T>().Where(condition);
               .
               .
    }

当我查看测试对象SQL查询时,它在其中使用where子句。但test2对象查询就像只从表中选择*一样。它从数据库中获取所有数据,然后在代码端使用when方法。我如何使用where子句获取数据,因为test2查询大数据需要很长时间。唯一的区别是其中一个代码具有泛型类,但sql查询不同。谢谢

EF上下文.设置<;T>;()方法

您的条件是类型为Func<T, bool>。当你查看context.Set<T>().Where()的重载时,你可以看到,取Func<T, bool>的重载返回IEnumerable<T>,而不是IQuerable<T>,因为它取源中的所有数据,然后应用filter。您应该使用Expression<Func<T, bool>> condition。你的方法应该是这样的:

public IQueryable<T> GetBy<T>(Expression<Func<T, bool>> condition)
    where T : class
{
    return Context.Set<T>().Where(condition);               
}

注意:如果您想在过滤后返回IEnumerable,您可以将其保持为:

public IEnumerable<T> GetBy<T>(Expression<Func<T, bool>> condition)
    where T : class
{
    // Should also work without AsEnumerable()
    return Context.Set<T>().Where(condition).AsEnumerable();               
}

请改用Expression

Expression<Func<T, bool>> condition

当您使用Func时,它不能被中继到SQL。你得到了完整的数据,并将它们过滤在内存中。在Expression的情况下,它将被传输到SQL,您将从SQL服务器获得过滤后的数据。