为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Func 和 Expression Func 运行查询之间的区别

使用 Func 和 Expression Func 运行查询之间的区别

C#
冉冉说 2021-10-31 11:04:37
我一直在互联网上搜索以找出 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();    }我把断点放在返回上,第一个它返回 12 行,第二个它返回 1200 行,谓词是:s=>s.id="12345"第二个,在获取数据后应用谓词,我的问题是,我们在处理数据库时通常应该使用表达式 func 吗?
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

AFunc<T>是一个委托,而 aExpression<Func<T>>是一个表达式。


表达式是一种抽象。


一个Expression<T>可以编译成一个Func<T>:


Expression<Func<int, int>> expr = a => a + 1;

Func<int,int> func = expr.Compile();

var res = func(1); // (1+1) = 2

因此,将表达式视为一种表示表达式的树。


这棵树是抽象的,你可以用它做很多事情。


那么,当涉及到 SQL 时,我们如何才能利用这种行为呢?


您可以创建某人(实体框架)将转换为 SQL 的表达式。


所以当你有一个像这样的表达式时:


users.Where(u => u.Name.StartsWith("a"));

它可以被翻译成 SQL,如:


select * from Users where Name like 'a%'

由于有人编写了将表达式转换为 sql 的代码,它支持多种方法但不是全部。因此,有时它会告诉您它无法将您的方法转换为 SQL,您必须提供一个Expression<Func<T>>替代方法或在 SQL 运行后运行该方法(使用 Linq to Objects)。


最重要的是,在大多数情况下,您更愿意使用表达式而不是 IQueryables,并使用将在数据库上运行的过滤器创建 SQL 查询,而不是获取大量的数据库条目并在您的代码中过滤它们。


查看完整回答
反对 回复 2021-10-31
  • 2 回答
  • 0 关注
  • 198 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信