我一直在查看一些使用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
}
答案 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表中获取所有内容并在内存中执行搜索。