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);

时间: 2024-10-26 08:57:03

Entity Framework 第四篇 优化SQL查询的相关文章

Entity Framework学习中级篇

1-EF支持复杂类型的实现 本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作. 通常,复杂类型是指那些由几个简单的类型组合而成的类型.比如:一张Customer表,其中有FristName和LastName字段,那么对应的Customer实体类将会有FristName和LastName这两个属性.当我们想把FirstName和LastName合成一个名为CustomerName属性时,此时,如果要在EF中实现这个目的,那么我们就需要用到复杂类型. 目前,由于EF不

Entity Framework 4 第一篇 POCO

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 Entity Framework 4 第一篇 POCO 在EFv1版本中,并没有提供对POCO(Plain Old CLR Objects)的支持.目前,在.Net4.0 Beta2中的EF 4完善了很多.可以预见,正式的EF4版本应该会有很多

Entity Framework多表多条件动态查询

方式一  Linq To Entity形式: /// <summary> /// 查询的数据 /// </summary> /// <param name="order">升序asc(默认)还是降序desc</param> /// <param name="sort">排序字段</param> /// <param name="search">查询条件</p

entity framework 新手入门篇(3)-entity framework实现orderby,count,groupby,like,in,分页等

前面我们已经学习了entityframework的基本的增删改查,今天,我们将在EF中实现一些更加贴近于实际功能的SQL方法. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和seller表. 在本次学习之前,我们先要了解一个神奇的接口,iqueryable这个接口类似于ienumable,但并不完全相同,Iqueryable是可查询类型需要实现的最重要的接口,在其Count,ToList,ToArray之后才会真正执行查询,所以,为了保证性能,请尽量在最后一步在进行Co

entity framework 新手入门篇(2)-entity framework基本的增删改查

经过前两节的简单描述,终于可以进入entity framework的使用部分了.本节将对entity framework原生的增删改查进行讲解. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和seller表. 一.entity framework 相关类的理解. 首先,House数据库在映射后会生成一个名为HouseEntities的类,这个类我们称之为数据上下文,可以简单的理解为数据库的部分映射(如果映射了全部的表,视图,存储过程,则可看作全部映射). 使用数据库的时

Entity Framework学习初级篇

1--EF基本概况 最近在学习研究微软的EF,通过这时间的学习研究,感觉这个EF目前来说还不是很完善,半成品.不过,据说在.Net4.0中,微软将推荐使用此框架,并会有所改善.而且,现在基本上所有数据库均提供了对EF的支持.因此,为以后做技术准备可以学习研究以下.但是,我个人觉得就目前来说,在实际项目慎用此框架. 下面简单的介绍以下这个EF. 在.Net Framework SP1微软包含一个实体框架(Entity Framework),此框架可以理解成微软的一个ORM产品.用于支持开发人员通过

Entity Framework学习初级篇1--EF基本概况《转》

最近在学习研究微软的EF,通过这时间的学习研究,感觉这个EF目前来说还不是很完善,半成品.不过,据说在.Net4.0中,微软将推荐使用此框架,并会有所改善.而且,现在基本上所有数据库均提供了对EF的支持.因此,为以后做技术准备可以学习研究以下.但是,我个人觉得就目前来说,在实际项目慎用此框架. 下面简单的介绍以下这个EF. 在.Net Framework SP1微软包含一个实体框架(Entity Framework),此框架可以理解成微软的一个ORM产品.用于支持开发人员通过对概念性应用程序模型

entity framework 新手入门篇(1)-建立模型

entity framework是微软官方免费提供给大家的一套ORM(Object Relational Mapping对象关系映射)解决方案.它不仅可以帮助我们解决数据缓存的问题,还能在最小的开销下实现完全的OO(Object Oriented面向对象)编程.实乃中小项目中敏捷开发的一大福祉.博主作为一只刚入本行的菜鸟,有幸参加开发了几个使用entity framework(以下简称EF)的项目,虽然在这些项目开发的过程中,走了许多的弯路,网上的资料也不甚齐全.在摸爬滚打了一年之后,也算有了一

Entity Framework基础—第二篇

实体框架(Entity Framework) 简称EF,属于数据持久(持久保存)架里面的一种,其他的还有NHibernate,ibaties,Dapper.PetaPOCO...等,都是基于ORM思想. 首先介绍下O/R Mapping(ORM) 1.什么是ORM?ORM指的是面向对象的对象模型和关系数据库的数据结构之间的相互转化,可以理解为把表实体和表相互转化(在任何平台都适用,如php,java等). 传统ADO.net操作数据库: 基于ORM思想操作数据库: 接下来我们就一步步创建项目: