|
Как оптимально написать этот запрос на linq?
|
|||
---|---|---|---|
#18+
select r.Name, sum(case when Conclusion=0 then 1 else 0 end) as Conc0, sum(case when Conclusion=1 then 1 else 0 end) as Conc1 from dc.DiagnosticCards dc with(nolock) inner join dic.Regions ro with(nolock) on ro.Id=dc.InspectionRegionId inner join dic.Regions r with(nolock) on r.Id=ro.OblId where InspectionDate between '2012-01-01' and '2013-01-01' group by r.TypeObj, r.Name order by r.TypeObj, r.Name Запрос на sql . Время выполнения 1 секунд. Написал на linq : var result = (from dc in dbDiagInsp.Ctx.DiagnosticCards join r in dbDiagInsp.Ctx.Regions on dc.InspectionRegionId equals r.Id join pr in dbDiagInsp.Ctx.Regions on r.OblId equals pr.Id where dc.InspectionDate >= '2012-01-01' && dc.InspectionDate < '2013-01-01' select new { RegionName = pr.Name, pr.TypeObj, TrueConcl = dc.Conclusion ? 1 : 0, FalseConcl = dc.Conclusion == false ? 1 : 0 }).ToList(); var endResult = (from r in result group r by new { r.TypeObj, r.RegionName } into g orderby g.Key.TypeObj, g.Key.RegionName select new { g.Key.RegionName, TrueConclCount = g.Sum(_ => _.TrueConcl), FalseConclCount = g.Sum(_ => _.FalseConcl) }).ToList(); Результат выполнения тот же самый. Но время выполнения 9 секунд. И смотрю Sql Profiler-ом в базу отправляет немножко другой запрос. Так как группировку и сортировку я делаю в коде. Теперь вопрос, как можно написать этот запрос на linq, чтобы в базу отправлял аналогичный запросу на sql? Чтобы группировку и сортировку делать в самом запросе ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2013, 09:59 |
|
Как оптимально написать этот запрос на linq?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2013, 10:07 |
|
Как оптимально написать этот запрос на linq?
|
|||
---|---|---|---|
#18+
Гость333, скажу банальность, но почему вы группировку не засовываете в свой запрос, а делаете потом? см Linq group by ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2013, 11:29 |
|
Как оптимально написать этот запрос на linq?
|
|||
---|---|---|---|
#18+
netivan, Если что, я вообще не тяну данные из БД при помощи LINQ :-) В наших проектах все данные из БД извлекаются при помощи хранимой логики, а LINQ используется для удобной трансляции полученных датасетов в объектную модель приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2013, 11:54 |
|
Как оптимально написать этот запрос на linq?
|
|||
---|---|---|---|
#18+
Вроде разобрался. var result = (from dc in dbDiagInsp.Ctx.DiagnosticCards join r in dbDiagInsp.Ctx.Regions on dc.InspectionRegionId equals r.Id join pr in dbDiagInsp.Ctx.Regions on r.OblId equals pr.Id where dc.InspectionDate >= beginDate && dc.InspectionDate < endDate select new { RegionName = pr.Name, pr.TypeObj, TrueConcl = dc.Conclusion ? 1 : 0, FalseConcl = dc.Conclusion == false ? 1 : 0 }).GroupBy(x => new { x.TypeObj, x.RegionName }).OrderBy(x => x.Key.TypeObj).ThenBy(x => x.Key.RegionName) .Select(x =>new { x.Key.RegionName, TrueConclCount = x.Sum(_ => _.TrueConcl), FalseConclCount = x.Sum(_ => _.FalseConcl) }) .ToList(); ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2013, 12:08 |
|
|
start [/forum/topic.php?fid=17&msg=38169292&tid=1350090]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 272ms |
total: | 407ms |
0 / 0 |