我已将应用程序中的where子句分解为自己的库,然后在运行时将它们传递给数据库。这样做是为了帮助测试。
我将日志附加到数据库以查看生成的sql是什么,我注意到没有列出where子句。数据仍然被过滤,这使我相信数据是在应用程序而不是在数据库中过滤的。谁能证实这一点?有更好的方法吗?
以下是一个示例:
Where Clause
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();
}
答案 0 :(得分:1)
LINQ to Objects确实在内存中过滤了数据。当您将Func<T, bool>
传递给Where
方法时,实际上您正在调用Enumerable.Where
。如果您想调用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();
}