将 where 子句作为函数传递
Passing where clause as a func
我已经将应用程序中的 where 子句分解为它们自己的库,然后在 运行 时将它们传递给数据库。这样做是为了帮助测试。
我将日志附加到数据库以查看生成的 sql 是什么,我注意到未列出 where 子句。数据仍然被过滤,所以我相信数据是在应用程序中而不是在数据库中过滤的。谁能证实这一点?有更好的方法吗?
这是一个示例:
Where子句
private Func<Message, bool> GetSearchWhere(string q, string type)
{
return m => m.Name.Contains(q) && m.Type == type;
}
数据库调用
private List<Messages> GetMessages(Func<Message, bool> where)
{
return Messaging.Messages.Where(where).ToList();
}
LINQ to Objects确实在内存中过滤了数据。当您将 Func<T, bool>
传递给 Where
方法时,您实际上是在调用 Enumerable.Where
. If you want to call Queryable.Where
(从而在数据库中进行过滤),那么您需要传递 Expression<Func<T, bool>
。
为此,您只需更改方法的签名即可:
private Expression<Func<Message, bool>> GetSearchWhere(string q, string type)
{
return m => m.Name.Contains(q) && m.Type == type;
}
private List<Messages> GetMessages(Expression<Func<Message, bool>> where)
{
return Messaging.Messages.Where(where).ToList();
}
我已经将应用程序中的 where 子句分解为它们自己的库,然后在 运行 时将它们传递给数据库。这样做是为了帮助测试。
我将日志附加到数据库以查看生成的 sql 是什么,我注意到未列出 where 子句。数据仍然被过滤,所以我相信数据是在应用程序中而不是在数据库中过滤的。谁能证实这一点?有更好的方法吗?
这是一个示例:
Where子句
private Func<Message, bool> GetSearchWhere(string q, string type)
{
return m => m.Name.Contains(q) && m.Type == type;
}
数据库调用
private List<Messages> GetMessages(Func<Message, bool> where)
{
return Messaging.Messages.Where(where).ToList();
}
LINQ to Objects确实在内存中过滤了数据。当您将 Func<T, bool>
传递给 Where
方法时,您实际上是在调用 Enumerable.Where
. If you want to call Queryable.Where
(从而在数据库中进行过滤),那么您需要传递 Expression<Func<T, bool>
。
为此,您只需更改方法的签名即可:
private Expression<Func<Message, bool>> GetSearchWhere(string q, string type)
{
return m => m.Name.Contains(q) && m.Type == type;
}
private List<Messages> GetMessages(Expression<Func<Message, bool>> where)
{
return Messaging.Messages.Where(where).ToList();
}