powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / плохой запрос EF5
3 сообщений из 3, страница 1 из 1
плохой запрос EF5
    #38061214
artemdude
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день

у меня небольшая проблемка с ef5
раньше все время ходили слухи что linq to sql генерирует плохие запросы, но потом уже стали говорить что все давно исправлено. Решил использовать на работе ef5

написал запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select 
		s.stateid,
		s.statename,
		sum(o.paymenttotal) total
from orders o with (nolock)
	inner join transactiontypes tt WITH (NOLOCK)
			on o.transactiontypeid = tt.transactiontypeid
	inner join jurisdictions j WITH (NOLOCK)
			on tt.jurisdictionid = j.jurisdictionid
	inner join states s WITH (NOLOCK)
			on s.stateid = j.stateid
	group by s.statename, s.stateid
	order by total desc



потом написал его на Linq
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
          var  a  = (from o in _context.orders
                        join tt in _context.transactiontypes
                            on o.transactiontypeid equals tt.transactiontypeid
                        join j in _context.jurisdictions
                            on tt.jurisdictionid equals j.jurisdictionid
                        join s in _context.states
                            on j.stateid equals s.stateid
                        group new { o, s } by 
                            new
                            {
                                s.stateid,
                                s.statename
                            }
                            into grouping
                            select new
                            {
                                stateId = grouping.Key.stateid,
                                stateName = grouping.Key.statename,
                                total = grouping.Sum(tot => tot.o.paymenttotal)
                            }).OrderByDescending(t => t.total);



и вот что он мне сгенерировал:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
{SELECT 
[Project2].[stateid] AS [stateid], 
[Project2].[statename] AS [statename], 
[Project2].[C1] AS [C1]
FROM ( SELECT 
	[Distinct1].[stateid] AS [stateid], 
	[Distinct1].[statename] AS [statename], 
	(SELECT 
		SUM([Extent5].[paymenttotal]) AS [A1]
		FROM    [dbo].[orders] AS [Extent5]
		INNER JOIN [dbo].[transactiontypes] AS [Extent6] ON [Extent5].[transactiontypeid] = [Extent6].[transactiontypeid]
		INNER JOIN [dbo].[jurisdictions] AS [Extent7] ON [Extent6].[jurisdictionid] = [Extent7].[jurisdictionid]
		INNER JOIN [dbo].[states] AS [Extent8] ON [Extent7].[stateid] = [Extent8].[stateid]
		WHERE ([Distinct1].[stateid] = [Extent8].[stateid]) AND ([Distinct1].[statename] = [Extent8].[statename])) AS [C1]
	FROM ( SELECT DISTINCT 
		[Extent4].[stateid] AS [stateid], 
		[Extent4].[statename] AS [statename]
		FROM    [dbo].[orders] AS [Extent1]
		INNER JOIN [dbo].[transactiontypes] AS [Extent2] ON [Extent1].[transactiontypeid] = [Extent2].[transactiontypeid]
		INNER JOIN [dbo].[jurisdictions] AS [Extent3] ON [Extent2].[jurisdictionid] = [Extent3].[jurisdictionid]
		INNER JOIN [dbo].[states] AS [Extent4] ON [Extent3].[stateid] = [Extent4].[stateid]
	)  AS [Distinct1]
)  AS [Project2]
ORDER BY [Project2].[C1] DESC}



печально как то, хотя и выдает правильный результат.

подскажите, может я что то не так написал?
...
Рейтинг: 0 / 0
плохой запрос EF5
    #38061227
artemdude
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
плюс время выполнения сгенерированного запроса ровно в 2 раза больше :(
(проверял через SET STATISTICS TIME ON)
...
Рейтинг: 0 / 0
плохой запрос EF5
    #38065583
Gluck_13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artemdudeДобрый день

у меня небольшая проблемка с ef5
раньше все время ходили слухи что linq to sql генерирует плохие запросы, но потом уже стали говорить что все давно исправлено. Решил использовать на работе ef5

написал запрос:
потом написал его на Linq
и вот что он мне сгенерировал:

печально как то, хотя и выдает правильный результат.

В таких случаях иногда помогает создание последовательности двух запросов, типа:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
          var  a1  = (from o in _context.orders
                        join tt in _context.transactiontypes
                            on o.transactiontypeid equals tt.transactiontypeid
                        join j in _context.jurisdictions
                            on tt.jurisdictionid equals j.jurisdictionid
                        join s in _context.states
                            on j.stateid equals s.stateid
                        select new { 
                                s.stateid,
                                s.statename
                                o.paymenttotal
                            });
          var a = (from e in a1
                      group e by 
                            new
                            {
                                e.stateid,
                                e.statename
                            }
                            into grouping
                            select new
                            {
                                stateId = grouping.Key.stateid,
                                stateName = grouping.Key.statename,
                                total = grouping.Sum(tot => tot.paymenttotal)
                            }).OrderByDescending(t => t.total);
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / плохой запрос EF5
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]