我正在进行链接LINQ查询,如下所示。我试图找出query.ToList();
缓慢的原因。 SQL查询很快(毫秒),但代码需要一分钟。链接的原因是重用存储库功能。
如何查看执行时的实际SQL查询
正在运行query.ToList();
?
//Client
var query = _service.GetResultsByStatus(status, bType, tType);
var result = query.ToList(); //takes a long time to execute
//Service function
public IEnumerable<CustomResult> GetResultsByStatus(string status, string bType, string tType) {
IEnumerable<CustomResult> result = null;
result = repo.GetResults(bType).Where(item => item.tStatus == status && (tType == null || item.tType == tType))
.Select(item => new CustomResult {
A = item.A,
B = item.B,
});
return result;
}
// Repository Function (reused in many places)
public IEnumerable<my_model> GetResults(string bType) {
return from p in dbContext.my_model()
where p.bType.Equals(bType)
select p;
}
答案 0 :(得分:4)
您的.Where(item => item.tStatus == status && (tType == null || item.tType == tType))
和.Select
正在完成&#34;本地&#34;在你的PC上...... SQL返回大量无用的行和列,然后过滤&#34;在你的电脑上。
public IEnumerable<my_model> GetResults(string bType) {
return from p in dbContext.my_model()
where p.bType.Equals(bType)
select p;
}
将其更改为
public IQueryable<my_model> GetResults(string bType) {
通常IEnumerable<>
表示&#34;下游LINQ将在本地执行&#34;,IQueryable<>
表示&#34;下游LINQ将在服务器上执行&#34;。在这种情况下,Where
和Select
是&#34;下游&#34;来自IEnumerable<>
中的查询转换。请注意,虽然可以(并且很容易)将IQueryable<>
转换为IEnumerable<>
,但通常情况并非如此。 AsQueryable<>
创建了一个&#34;假的&#34; IQueryable<>
在本地执行,主要用于单元测试。