Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Как оптимально написать этот запрос на linq?  [new]
Amankeldi
Member

Откуда:
Сообщений: 36
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 фев 13, 09:59    [13992319]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимально написать этот запрос на linq?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Amankeldi,

Вам в форум по LINQ.

Модератор: Тема перенесена из форума "Microsoft SQL Server".


Сообщение было отредактировано: 28 фев 13, 10:11
28 фев 13, 10:07    [13992364]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимально написать этот запрос на linq?  [new]
netivan
Member

Откуда:
Сообщений: 8768
Гость333,

скажу банальность, но почему вы группировку не засовываете в свой запрос, а делаете потом? см Linq group by
28 фев 13, 11:29    [13992816]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимально написать этот запрос на linq?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
netivan,

Если что, я вообще не тяну данные из БД при помощи LINQ :-)
В наших проектах все данные из БД извлекаются при помощи хранимой логики, а LINQ используется для удобной трансляции полученных датасетов в объектную модель приложения.
28 фев 13, 11:54    [13992959]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимально написать этот запрос на linq?  [new]
Amankeldi
Member

Откуда:
Сообщений: 36
Вроде разобрался. 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 фев 13, 12:08    [13993073]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить