将where子句作为func传递

时间:2016-05-19 19:06:34

标签: entity-framework func

我已将应用程序中的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();
}

1 个答案:

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