Entity Framework 第四篇 优化SQL查询
Expression<Func<TEntity, bool>>与Func<TEntity, bool>的异同
public IList<TEntity> Search<TEntity>(Expression<Func<TEntity, bool>> predicate = null) where TEntity : class
{
if (predicate == null)
{
return dbContext.Set<TEntity>().ToList();
}
else
{
return dbContext.Set<TEntity>().Where(predicate).ToList();
} }
本人通过跟踪sql语句得知
predicate如果为委托类型的时候,dbContext.Set<TEntity>().Where(predicate).ToList();对应的sql语句是
SELECT
[Extent1].[UserID] AS [UserID],
[Extent1].[LoginName] AS [LoginName],
[Extent1].[Password] AS [Password],
[Extent1].[UserName] AS [UserName],
[Extent1].[UserType] AS [UserType],
[Extent1].[Tel] AS [Tel],
[Extent1].[CreateDate] AS [CreateDate],
[Extent1].[LoginNum] AS [LoginNum],
[Extent1].[LastDate] AS [LastDate],
[Extent1].[ShopID] AS [ShopID]
FROM [dbo].[S_Users] AS [Extent1]
但是当predicate如果为表达式树的时候,语句如下,
SELECT
[Extent1].[UserID] AS [UserID],
[Extent1].[LoginName] AS [LoginName],
[Extent1].[Password] AS [Password],
[Extent1].[UserName] AS [UserName],
[Extent1].[UserType] AS [UserType],
[Extent1].[Tel] AS [Tel],
[Extent1].[CreateDate] AS [CreateDate],
[Extent1].[LoginNum] AS [LoginNum],
[Extent1].[LastDate] AS [LastDate],
[Extent1].[ShopID] AS [ShopID]
FROM [dbo].[S_Users] AS [Extent1]
WHERE N'liuyangh' = [Extent1].[LoginName]
所以我们尽量用表达式树传参,而不是单纯地lambda表达式或者委托类型。
为什么会这样呢?
因为dbContext.Set<TEntity>().Where(predicate),当是表达式树的时候返回的是IQueryable<TSource>
public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
如果是委托类型返回的是IEnumerable<TSource>
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
Entity Framework 第四篇 优化SQL查询的更多相关文章
- Entity Framework 学习初级篇4--Entity SQL
Entity SQL 是 ADO.NET 实体框架 提供的 SQL 类语言,用于支持 实体数据模型 (EDM).Entity SQL 可用于对象查询和使用 EntityClient 提供程序执行的查询 ...
- Lazy<T>在Entity Framework中的性能优化实践
Lazy<T>在Entity Framework中的性能优化实践(附源码) 2013-10-27 18:12 by JustRun, 328 阅读, 4 评论, 收藏, 编辑 在使用EF的 ...
- Entity Framework学习笔记(六)----使用Lambda查询Entity Framework(1)
请注明转载地址:http://www.cnblogs.com/arhat 在前几章中,老魏一直使用Linq来查询Entity Framework.但是老魏感觉,如果使用Linq的话,那么Linq的返回 ...
- Entity Framework 学习中级篇1—EF支持复杂类型的实现
本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作. 通常,复杂类型是指那些由几个简单的类型组合而成的类型.比如:一张Customer表,其中有FristName和Las ...
- Entity Framework学习初级篇2
Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager类的介绍 本节,简单的介绍E ...
- SQL常见优化Sql查询性能的方法有哪些?
常见优化Sql查询性能的方法有哪些? 1.查询条件减少使用函数,避免全表扫描 2.减少不必要的表连接 3.有些数据操作的业务逻辑可以放到应用层进行实现 4.可以使用with as 5.使用“临时表”暂 ...
- ElasticSearch查询 第四篇:匹配查询(Match)
<ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...
- Entity Framework 学习初级篇5--ObjectQuery查询及方法
ObjectQuery 类支持对 实体数据模型 (EDM) 执行 LINQ to Entities 和 Entity SQL 查询.ObjectQuery 还实现了一组查询生成器方法,这些方法可用于按 ...
- entity framework 新手入门篇(3)-entity framework实现orderby,count,groupby,like,in,分页等
前面我们已经学习了entityframework的基本的增删改查,今天,我们将在EF中实现一些更加贴近于实际功能的SQL方法. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和 ...
随机推荐
- 某个点到其他点的曼哈顿距离之和最小(HDU4311)
Meeting point-1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- PHP中的赋值运算符
PHP的赋值运算符有两种,分别是: (1)“=”:把右边表达式的值赋给左边的运算数.它将右边表达式值复制一份,交给左边的运算数.换而言之,首先给左边的运算数申请了一块内存,然后把复制的值放到这个内存中 ...
- SPOJ COT3 Combat on a tree(Trie树、线段树的合并)
题目链接:http://www.spoj.com/problems/COT3/ Alice and Bob are playing a game on a tree of n nodes.Each n ...
- 2013年各大小IT公司待遇
2013年各大小IT公司待遇(初版 摘自好网)本人西电硕士,根据今年找工作的情况以及身边同学的汇总,总结各大公司的待遇如下,吐血奉献给各位学弟学妹,公司比较全,你想去的公司不在这里面,基本上是无名 ...
- Junit单元测试-环境配置
JUnit是Java单元测试框架,已经在Eclipse中默认安装.目前主流的有JUnit3和JUnit4.JUnit3中,测试用例需要继承TestCase类.JUnit4中,测试用例无需继承TestC ...
- ASP.NET MVC(二)
休息一下还是继续ASP.NET MVC 的基础知识. 这篇文件我想和大家一起熟悉下ASP.NET MVC项目的目录结构及dll. 1. ASP.NET MVC 项目的目录结构 App_Data: 存 ...
- 关于wxwidgets图形界面的关闭窗口的按钮无效的解决办法
这是使用wxsmith设计界面时的情况,如果用纯代码写的界面,关闭按钮就很奇怪地有效 道听途说,窗口的关闭是由一个方法控制着.大概是这样的: void PlainFrame::OnClose(wxCl ...
- 【LAMP】在Debian系linux下安装LAMP
一.安装基本的编译环境 apt-get install build-essential 二.安装MySQL apt-get install mysql-server 三.安装Apache apt-ge ...
- OpenCV cv::Mat类
using namespace cv; 1.Mat的声明: Mat m=Mat(rows, cols, type); Mat m=Mat(Size(width,height), type); type ...
- android 应用架构随笔五(ActionBar与侧滑菜单DrawerLayout)
ActionBar(V7)的添加非常简单,只需要在AndroidManifest.xml中指定Application或Activity的theme是Theme.Holo或其子类就可以了,在Androi ...