2016-05-19 4 views
1

自分のアプリケーション内のwhere句を自分のライブラリに分割し、実行時にデータベースに渡しました。これはテストに役立つために行われました。funcとしてwhere句を渡す

dbにログを添付して、生成されたsqlが何であるかを確認しました。where節がリストされていないことがわかりました。データはまだフィルタリングされているので、データはデータベースではなくアプリでフィルタリングされていると私には信じられます。誰でもこれを確認できますか?これを行うより良い方法はありますか?ここで

はサンプルです:

private Func<Message, bool> GetSearchWhere(string q, string type) 
{ 
    return m => m.Name.Contains(q) && m.Type == type; 
} 

DBコール

private List<Messages> GetMessages(Func<Message, bool> where) 
{ 
    return Messaging.Messages.Where(where).ToList(); 
} 

答えて

1

データが実際のオブジェクトにLINQによってメモリにフィルタリングされます。 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(); 
} 
関連する問題