实体框架代码中的Linq首先使用SQL还是首先获取整个表?

时间:2017-05-18 15:54:40

标签: c# entity-framework linq ef-code-first

我一直在查看一些使用Entity Framework代码进行数据库定义和访问的教程。我想知道何时使用Linq进行查询,是否将linq转换为SQL (select * from mytable where id = :id),或者是从数据库中检索整个表,然后将这些行过滤掉?

var item = DbContext.Users.Where(i => i.Id == id).FirstOrDefault();

运行SQL

select * 
from Users 
where id = :Id

还是从数据库中的users表中获取所有数据,然后使用linq过滤掉正确的行?

给出了课程

 public class ApplicationUser 
    { 
        #region Constructor 
        public ApplicationUser() 
        { 

        } 
        #endregion Constructor 

        #region Properties 
        [Key] 
        [Required] 
        public string Id { get; set; } 
        [Required] 
        [MaxLength(128)] 
        public string UserName { get; set; } 
        [Required] 
        public string Email { get; set; } 
        #endregion Properties 
    } 

和dbcontext

 public class ApplicationDbContext : DbContext 
    { 
        #region Constructor 
        public ApplicationDbContext(DbContextOptions options) : base(options) 
        { 
        } 
        #endregion Constructor 

        #region Methods 
        protected override void OnModelCreating(ModelBuilder modelBuilder) 
        { 
            base.OnModelCreating(modelBuilder); 

modelBuilder.Entity<ApplicationUser>().ToTable("Users"); 
                        #endregion Methods 

        #region Properties 
        public DbSet<ApplicationUser> Users { get; set; } 
        #endregion Properties 
    } 

2 个答案:

答案 0 :(得分:4)

由于您在查询中使用了FirstOrDefault(),因此无法获得整个表格。

查询类似于

SELECT TOP 1 * FROM ...

使用分析器(SQL Server案例中的SQL分析器)总是更好的主意,并查看在商店中执行的实际查询。

如果您迭代查询然后使用FirstOrDefault,这将使所有记录与DB中的条件匹配。因此,如果您有像(不要这样做)的查询

var item = DbContext.Users.Where(i => i.Id == id).ToList().FirstOrDefault();

如果您的查询没有任何条件,那么它将把整个表带入内存。

var item = DbContext.Users.ToList().FirstOrDefault();

答案 1 :(得分:1)

var item = DbContext.Users.Where(i => i.Id == id).FirstOrDefault();

将执行

select top(1) 
<list of column names> 
from mytable 
where id = :id

var item = DbContext.Users.ToList().Where(i => i.Id == id).FirstOrDefault();

将从SQL表中获取所有内容并在内存中执行搜索。

相关问题