C# 使用Func和Expression Func运行查询的区别

C# 使用Func和Expression Func运行查询的区别,c#,theory,func,C#,Theory,Func,我一直在互联网上搜索Func和Expression Func之间的区别,不知何故我找到了要点,第一个是函数获取数据,然后在内存中应用函数,第二个是将其转换为sql并在数据库中运行,在我运行这两个查询之后: public IEnumerable<T> SelectAll(Expression< Func<T, bool>> predicate) { return table.Where(predicate).ToLis

我一直在互联网上搜索Func和Expression Func之间的区别,不知何故我找到了要点,第一个是函数获取数据,然后在内存中应用函数,第二个是将其转换为sql并在数据库中运行,在我运行这两个查询之后:

 public IEnumerable<T> SelectAll(Expression< Func<T, bool>> predicate)
    {         
        return table.Where(predicate).ToList();
    }

     public IEnumerable<T> SelectAll(Func<T, bool> predicate)
    {

        return table.Where(predicate).ToList();

    }
第二个,在得到数据后应用谓词,我的问题是,我们在处理DB时通常应该使用表达式func

我的问题是,我们在处理DB时通常应该使用func这个表达式

是的,因为您希望向SQL server提供尽可能多的信息,以便它能够优化数据库访问,并且希望最小化从SQL server返回的数据(删除所有不必要的数据,并聚合SQL server可以轻松聚合的数据)因为将数据从SQL Server移动到.NET计算机甚至是一项“工作”

显然,如果在SQL中很难执行某些操作(如字符串操作),那么将其移动到.NET是可以接受的

请注意,使用LINQ,您无法很好地控制生成的查询,这很容易成为“多级野兽”,也无法真正确定查询的哪些部分将在SQL server上执行,哪些部分将在本地执行(例如,EF Core通常在本地执行GROUP BY),也无法访问SQL的许多高级功能(例如,所有分区方法)

我的问题是,我们在处理DB时通常应该使用func这个表达式

是的,因为您希望向SQL server提供尽可能多的信息,以便它能够优化数据库访问,并且希望最小化从SQL server返回的数据(删除所有不必要的数据,并聚合SQL server可以轻松聚合的数据)因为将数据从SQL Server移动到.NET计算机甚至是一项“工作”

显然,如果在SQL中很难执行某些操作(如字符串操作),那么将其移动到.NET是可以接受的

请注意,使用LINQ,您无法很好地控制生成的查询,这很容易成为“多级野兽”,也无法真正确定查询的哪些部分将在SQL server上执行,哪些部分将在本地执行(例如,EF Core通常在本地执行GROUP BY),也无法访问SQL的许多高级功能(例如所有的分区方法)。

A
Func
是一个委托,而
表达式
是一个表达式

表达式是一种抽象

表达式
可以编译成
Func

可以将其转换为SQL,如:

select * from Users where Name like 'a%'
由于有人编写了将表达式转换为sql的代码,它支持多种方法,但不是全部。因此,有时它会告诉您,它无法将您的方法转换为sql,您必须提供一个
表达式
,或者在sql运行后运行该方法(使用Linq to对象)

总之,在大多数情况下,您更喜欢使用表达式而不是IQueryables,并使用将在DB上运行的筛选器创建SQL查询,而不是获取大量DB条目并在代码中对其进行筛选。

A
Func
是一个委托,而
表达式
是一个表达式

表达式是一种抽象

表达式
可以编译成
Func

可以将其转换为SQL,如:

select * from Users where Name like 'a%'
由于有人编写了将表达式转换为sql的代码,它支持多种方法,但不是全部。因此,有时它会告诉您,它无法将您的方法转换为sql,您必须提供一个
表达式
,或者在sql运行后运行该方法(使用Linq to对象)


总之,在大多数情况下,您更喜欢使用表达式而不是IQueryables,并使用将在DB上运行的筛选器创建SQL查询,而不是获取大量DB条目并在代码中对其进行筛选。

“但第二,将其转换为SQL”更准确地转换为最终可以转换为SQL的内容(或其他)虽然这两个方法中的代码看起来相同,但实际上它调用的是不同的静态扩展
Where
方法-从
Queryable
和从
Enumerable
“但是第二,将其转换为sql”更精确地转换为最终可以转换为sql(或其他)的内容虽然这两个方法中的代码看起来相同,但实际上它调用了不同的静态扩展
Where
方法-从
Queryable
和从
Enumerable
调用。感谢您的精彩解释,所以根据您的说法,如果我做得对的话,想象一下我在使用这两种场景的查询上放置了秒表,检索时间可以e different?@mortezasol是的,但只有当查询有点复杂或投影(选择)时,您才会看到差异删除了许多列,或者删除了许多行…最后的区别通常取决于SQL无法返回的数据量。感谢您的精彩解释,所以根据您的说法,如果我没有弄错的话,想象一下我在使用这两种场景的查询上放置了秒表,检索时间可能会有所不同?@mortezasol是的,但您会看到d只有当查询有点复杂,或者投影(select)删除了许多列,或者where删除了许多行时,差异才会出现……最后,差异通常取决于SQL不能返回多少数据。
users.Where(u => u.Name.StartsWith("a"));
select * from Users where Name like 'a%'