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查询不同。谢谢
您的条件是类型为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服务器获得过滤后的数据。