LINQ-to-Entities WHERE 条件未在 sql 服务器上执行
LINQ-to-Entities WHERE condition not executed on sql server
我已经按照 Adam Freeman 的书学习了 ASP.NET MVC 5。我已经实现了书中描述的存储库模式。我正在使用 WHERE 并使用 SQL-EventProfiler 记录 SQL 命令,然后我将看不到 WHERE 条件。
这是我的示例代码,用于我使用的存储库 Ninject:
public interface IHelpRepository {
IEnumerable<Help> Helps { get; }
}
public class HelpRepository : IHelpRepository {
private HelpDBContext context = new HelpDBContext();
public IEnumerable<Help> Helps {
get { return context.Helps; }
}
}
public class Help {
[Required]
[Key]
public int Id { get; set; }
[Required]
public string Title { get; set; }
[Required]
public string Description { get; set; }
}
public class HelpController : Controller {
private IHelpRepository HelpRepository;
public HelpController (IHelpRepository helpRepository) {
this.HelpRepository= helpRepository;
}
public ActionResult HelpDescription(int Id) {
Help help = helpRepository.Helps.Where(h => h.Id == Id).SingleOrDefault<Help>();
return View("HelpDescription", help);
}
}
生成的 SQL-Command (XEventProfiler):
SELECT [Extent1].[Id] AS [Id], [Extent1].[Title] AS [Title], [Extent1].[Description] AS [Description] FROM [dbo].[Helps] AS [Extent1]
为什么生成的 SQL 命令中不包含 WHERE?
public IEnumerable Helps {
get { return context.Helps; }
}
您在此处 returning IEnumerable,此时查询已执行。有两件事你可以摆脱它
- 第一个选项是 return IQueryable 并使用 where 过滤器,然后像这样检查分析器
public IQueryable<Help> Helps {
get { return context.Helps; }
}
Help help = helpRepository.Helps.Where(h => h.Id == Id).SingleOrDefault<Help>();
- 第二种方法是创建一个在方法和 returns IEnumerable
中过滤的存储库方法
public IEnumerable<Help> Where(Expression<Func<Help,bool>> where)
{
return context.Helps.Where(where);
}
要了解 IQueryable 和 IEnumerable 之间的区别,只需阅读以下 link
IQueryable vs IEnumerable
IQueryable 始终对数据源上下文执行查询,而 IEnumerable 在内存中工作,从数据源提供程序获取数据后
我已经按照 Adam Freeman 的书学习了 ASP.NET MVC 5。我已经实现了书中描述的存储库模式。我正在使用 WHERE 并使用 SQL-EventProfiler 记录 SQL 命令,然后我将看不到 WHERE 条件。
这是我的示例代码,用于我使用的存储库 Ninject:
public interface IHelpRepository {
IEnumerable<Help> Helps { get; }
}
public class HelpRepository : IHelpRepository {
private HelpDBContext context = new HelpDBContext();
public IEnumerable<Help> Helps {
get { return context.Helps; }
}
}
public class Help {
[Required]
[Key]
public int Id { get; set; }
[Required]
public string Title { get; set; }
[Required]
public string Description { get; set; }
}
public class HelpController : Controller {
private IHelpRepository HelpRepository;
public HelpController (IHelpRepository helpRepository) {
this.HelpRepository= helpRepository;
}
public ActionResult HelpDescription(int Id) {
Help help = helpRepository.Helps.Where(h => h.Id == Id).SingleOrDefault<Help>();
return View("HelpDescription", help);
}
}
生成的 SQL-Command (XEventProfiler):
SELECT [Extent1].[Id] AS [Id], [Extent1].[Title] AS [Title], [Extent1].[Description] AS [Description] FROM [dbo].[Helps] AS [Extent1]
为什么生成的 SQL 命令中不包含 WHERE?
public IEnumerable Helps { get { return context.Helps; } }
您在此处 returning IEnumerable,此时查询已执行。有两件事你可以摆脱它
- 第一个选项是 return IQueryable 并使用 where 过滤器,然后像这样检查分析器
public IQueryable<Help> Helps {
get { return context.Helps; }
}
Help help = helpRepository.Helps.Where(h => h.Id == Id).SingleOrDefault<Help>();
- 第二种方法是创建一个在方法和 returns IEnumerable 中过滤的存储库方法
public IEnumerable<Help> Where(Expression<Func<Help,bool>> where)
{
return context.Helps.Where(where);
}
要了解 IQueryable 和 IEnumerable 之间的区别,只需阅读以下 link
IQueryable vs IEnumerable
IQueryable 始终对数据源上下文执行查询,而 IEnumerable 在内存中工作,从数据源提供程序获取数据后