我有一个数据访问类,花费了我一些时间才得以工作。对于我的应用程序,我需要获取不同类型的SQL Server表,其中WHERE子句仅通过列名称不同:有些列是read_time,其他列是ReadTime,还有其他列是LastModifiedTime。因此,我想传递WHERE子句,这样我就不需要为50个不同的表创建新方法。它看起来很简单,也可以工作,但我不明白其中的一些东西。
带有Expression<>作为参数的此方法有效:
带有Expression<>作为参数的此方法有效:
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();
}