Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Func<&燃气轮机;和表达<;Func<&燃气轮机&燃气轮机;可互换的?为什么在我的情况下,一个工作?_C#_Oop_Linq To Sql_Generics - Fatal编程技术网

C# 为什么Func<&燃气轮机;和表达<;Func<&燃气轮机&燃气轮机;可互换的?为什么在我的情况下,一个工作?

C# 为什么Func<&燃气轮机;和表达<;Func<&燃气轮机&燃气轮机;可互换的?为什么在我的情况下,一个工作?,c#,oop,linq-to-sql,generics,C#,Oop,Linq To Sql,Generics,我有一个数据访问类,我花了一段时间才开始工作。对于我的应用程序,我需要获取不同类型的SQL Server表,其中where子句仅因列名不同而不同:一些列是read_time,其他列是ReadTime,其他列是LastModifiedTime。所以我想我应该传入WHERE子句,这样我就不需要为50个不同的表创建一个新方法。它看起来很简单,而且很有效,但我不明白什么 此方法以表达式为参数,工作原理如下: internal List<T> GetObjectsGreaterThanRead

我有一个数据访问类,我花了一段时间才开始工作。对于我的应用程序,我需要获取不同类型的SQL Server表,其中where子句仅因列名不同而不同:一些列是read_time,其他列是ReadTime,其他列是LastModifiedTime。所以我想我应该传入WHERE子句,这样我就不需要为50个不同的表创建一个新方法。它看起来很简单,而且很有效,但我不明白什么

此方法以表达式为参数,工作原理如下:

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();
}
内部列表GetObjectsCreateThanReadTime(表达式whereClause),其中T:class
{
Table Table=this.Database.GetTable();
IEnumerable objects=table.Where(Where子句);
返回objects.ToList();
}
现在,我用这种方式(下面)试了一会儿,它会挂在最后一行(ToList())。首先,为什么要编译它?我的意思是,为什么表达式和Func可以互换用作参数?那么,为什么表达式可以工作,而Func版本只是挂起

注:上述方法与此方法之间的唯一区别是方法参数(表达式vs.Func)

内部列表GetObjectsCreateThanReadTime(Func whereClause),其中T:class
{
Table Table=this.Database.GetTable();
IEnumerable objects=table.Where(Where子句);
返回objects.ToList();
}

表达式版本调用,生成表达式树,表达式树(由
ToList
枚举时)转换为sql并在数据库服务器上执行。据推测,数据库服务器将利用基于筛选条件的索引,以避免读取整个表


Func版本调用which(当由
ToList
枚举时)加载整个表(您认为是挂起的),然后针对内存中的对象运行筛选条件。

这与答案结合在一起,本身就是对“表达式树的要点是什么?”问题的风格+1问&啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈。。。美好的完全有道理。非常感谢。
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();
}