私はデータアクセスクラスを持っています。私のアプリケーションでは、WHERE句は列名によって異なるSQL Serverテーブルの異なるタイプを取得する必要があります。いくつかの列はread_time、その他はReadTime、その他はLastModifiedTimeです。だから私はWHERE句を渡すと思ったので、50種類のテーブルに対して新しいメソッドを作成する必要はありませんでした。それはシンプルに見え、うまくいくが、私は何かを理解していない。パラメータとして表現<となぜFunc <>と式<Func<>>は互換性がありますか?なぜ私の場合は1つ働くのですか?
この方法で、>、作品:
internal List<T> GetObjectsGreaterThanReadTime<T>(Expression<Func<T, bool>> whereClause) where T : class
{
Table<T> table = this.Database.GetTable<T>();
IEnumerable<T> objects = table.Where(whereClause);
return objects.ToList();
}
は今、私はしばらくの間(下)このようにそれをしようとしていた、そしてそれはちょうど最後の行にハングアップするでしょう(ToListメソッド())。まず、なぜこれがコンパイルされますか?なぜ、ExpressionとFuncをパラメータとして同じ意味で使うことができるのでしょうか?それでは、Expressionはなぜ機能し、Funcのバージョンはちょうどハングするのですか?
注:上記のメソッドとこれとの唯一の違いは、メソッドパラメータ(Expression vs. Func)です。
internal List<T> GetObjectsGreaterThanReadTime<T>(Func<T, bool> whereClause) where T : class
{
Table<T> table = this.Database.GetTable<T>();
IEnumerable<T> objects = table.Where(whereClause);
return objects.ToList();
}
これは、回答と併せて、それ自体、「表現木のポイントは何ですか?」のいくつかに対する非常に良い応答です。スタイルの質問。 +1 Q&A –