【发布时间】:2017-01-02 09:50:19
【问题描述】:
我之前问过这个问题,但因为我没有提供代码而被否决。但我坚信我的问题与代码无关,我非常渴望解决这个问题。
基本上,我需要从 LINQ 查询中获取 2 个不同事物的计数,该查询正在构建中并且很长。
奇怪的是:当 select LINQ 查询在数据库服务器上执行时,它在第二次计数时超时(无论我将 CommandTimeout 设置为多长时间),但是当我从数据库中抓取相同的数据库实例时服务器并将其放在我的本地然后执行 LINQ 查询它会立即获得两个计数。
我的 SQL Profiler 在数据库服务器和本地服务器上都翻译了 SQL 查询,它们是相同的。当从我的本地生成的已翻译 SQL 查询在数据库服务器的 SQL Management Studio 上手动运行时,它也会立即返回计数。
这就是为什么我高度怀疑这不是代码问题或许多人建议的 N+1 问题。我怀疑这是一个环境问题,但我不知道为什么会这样。如果有人以前遇到过这种情况,有人可以提供意见吗?如果您需要 LINQ 代码,请告诉我,我可以缩短并上传。
IQueryable<StudentDm> studentQuery = GetListQuery();
IQueryable<StudentTestDm> studentTestQuery = studentQuery.SelectMany(a => a.StudentTests);
if (studentAcademicTestProficiencyGrowthParameter.TestTypeId.HasValue)
{
studentTestQuery = studentTestQuery.Where(a => a.TestTypeId == studentAcademicTestProficiencyGrowthParameter.TestTypeId);
}
DateTime serviceDateFrom = (studentAcademicTestProficiencyGrowthParameter.ServiceDateFrom.HasValue) ? studentAcademicTestProficiencyGrowthParameter.ServiceDateFrom.Value : DateTime.MinValue;
DateTime serviceDateTo = (studentAcademicTestProficiencyGrowthParameter.ServiceDateTo.HasValue) ? studentAcademicTestProficiencyGrowthParameter.ServiceDateTo.Value : DateTime.MaxValue;
// test 1 query
IQueryable<StudentTestDm> studentTest1Query = studentTestQuery;
if (studentAcademicTestProficiencyGrowthParameter.Test1SchoolYear.HasValue)
{
studentTest1Query = studentTest1Query.Where(a => a.Year == studentAcademicTestProficiencyGrowthParameter.Test1SchoolYear);
}
if (studentAcademicTestProficiencyGrowthParameter.Test1TestDate.HasValue)
{
studentTest1Query = studentTest1Query.Where(a => a.TestDate == studentAcademicTestProficiencyGrowthParameter.Test1TestDate);
}
// we grab the grouped students who has non-proficient test, and who does not have proficient test
IQueryable<IGrouping<StudentDm, StudentTestDm>> groupedStudentWithTest1 = studentTest1Query.GroupBy(a => a.Student).Where(a => a.Select(b => b.TestLevel.ProficiencyId).Contains((int)LookUpEnum.LookUpEnum.TestLevelProficiency.NotProficient)
&& !a.Select(b => b.TestLevel.ProficiencyId).Contains((int)LookUpEnum.LookUpEnum.TestLevelProficiency.Proficient));
// get the count of students whos attended less than 30 days of services
count1 = groupedStudentWithTest1.Where(a => a.Key.StudentServices.Where(b => b.Date >= serviceDateFrom && b.Date <= serviceDateTo).GroupBy(b => b.Date).Count() < 30).Count();
// test 2 query
IQueryable<StudentTestDm> studentTest2Query = studentTestQuery;
if (studentAcademicTestProficiencyGrowthParameter.Test2SchoolYear.HasValue)
{
studentTest2Query = studentTest2Query.Where(a => a.Year == studentAcademicTestProficiencyGrowthParameter.Test2SchoolYear);
}
if (studentAcademicTestProficiencyGrowthParameter.Test2TestDate.HasValue)
{
studentTest2Query = studentTest2Query.Where(a => a.TestDate == studentAcademicTestProficiencyGrowthParameter.Test2TestDate);
}
// we are grabbing the students who are not-proficient in test 1 but are proficient in test 2
IQueryable<IGrouping<StudentDm, StudentTestDm>> groupedStudentWithImprovedTest2 = studentTest2Query.GroupBy(a => a.Student).Where(a => a.Select(b => b.TestLevel.ProficiencyId).Contains((int)LookUpEnum.LookUpEnum.TestLevelProficiency.Proficient))
.Where(a => groupedStudentWithTest1.Select(b => b.Key.Id).Contains(a.Key.Id));
// THIS QUERY TIMES OUT (ON Database Server): get the count students who attended less than 30 days of services
count2 = groupedStudentWithImprovedTest2.Where(a => a.Key.StudentServices.Where(b => b.Date >= serviceDateFrom && b.Date <= serviceDateTo).GroupBy(b => b.Date).Count() < 30).Count();
【问题讨论】:
-
检查与服务器的连接是否与您的数据库正确
-
@Prabu 该评论毫无意义。请解释您所说的“与您的数据库相符” 的含义。
-
那么您的期望是什么?有人在不知道您的代码、数据库或环境的情况下提出解决方案?
-
@nvoigt 我什么都不期待。我希望以前遇到过这种确切情况的人可以提供一些提示,说明我可以直接开始调试。我已经尽可能多地描述了我的问题。如果你仍然坚信我需要上传我的 LINQ 代码,那么你可以这么说。
-
@CodeCaster andy 收到超时错误。可能是因为没有建立连接..
标签: c# sql-server linq