将 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();
}