powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Оптимизация EF Core 2.0
9 сообщений из 9, страница 1 из 1
Оптимизация EF Core 2.0
    #39676742
gr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gr
Гость
Добрый день.

Продолжаю изучение EF Core 2.0.

Есть два класса
Код: 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.
public class PR_Account
    {
        public string No { get; set; }
        public string Name { get; set; }
        public int AccountType { get; set; }
        public byte Blocked { get; set; }
        public byte DirectPosting { get; set; }
        public int Indentation { get; set; }
        public string Totaling { get; set; }
        public int Type { get; set; }
    }

public class PR_GLEntry
    {
        public int EntryNo { get; set; }
        public string AccountNo { get; set; }
        public decimal Amount { get; set; }
        public string DocumentNo { get; set; }
        public string Description { get; set; }
        public string BalAccountNo { get; set;        }
        public int BalAccountType { get; set; }
        public int SourceType { get; set; }
        public string SourceNo { get; set; }
        public DateTime PostingDate { get; set; }
        public DateTime DocumentDate { get; set; }
    }



Мне нужно получить запрос типа:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT [No]
      ,[Name]
      ,(select sum([Amount])
	    from [dbo].[PR_GLEntries] G
		where G.[AccountNo] = A.No)
  FROM [Pronet2].[dbo].[PR_Accounts] A



Я получаю результат методом GetByDate:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
   public class AccountSum
    {
        public PR_Account Account { get; set; }
        public decimal Sum { get; set; }

        public static List<AccountSum> GetByDate(PRContext db, DateTime reportDate)
        {
            var res = db.PR_Accounts.GroupJoin(db.PR_GLEntries
                , a => a.No
                , g => g.AccountNo
                , (acc, sumAcc) =>
                new AccountSum { Account = acc, Sum = sumAcc.Sum(ga => ga.Amount) }).ToList();

            return res;
         }
    }



Результат правильный! Да вот беда, к БД идет обращение в виде:
Код: sql
1.
2.
3.
4.
SELECT [a].[No], [a].[AccountType], [a].[Blocked], [a].[DirectPosting], [a].[Indentation], [a].[Name], [a].[Totaling], [a].[Type], [g].[EntryNo], [g].[AccountNo], [g].[Amount], [g].[BalAccountNo], [g].[BalAccountType], [g].[Description], [g].[DocumentDate], [g].[DocumentNo], [g].[PostingDate], [g].[SourceNo], [g].[SourceType]
FROM [PR_Accounts] AS [a]
LEFT JOIN [PR_GLEntries] AS [g] ON [a].[No] = [g].[AccountNo]
ORDER BY [a].[No]



Т.е. все строки передаются в приложение. Это совсем не то что я хотел! Как написать команду, что бы она соответствовала ожидаемому запросу (без выборки всех строк)?
...
Рейтинг: 0 / 0
Оптимизация EF Core 2.0
    #39676748
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так в требуемом запросе тоже будут выбираться все строки
Код: sql
1.
2.
3.
4.
5.
6.
SELECT [No]
      ,[Name]
      ,(select sum([Amount])
	    from [dbo].[PR_GLEntries] G
		where G.[AccountNo] = A.No)
  FROM [Pronet2].[dbo].[PR_Accounts] A

никакого фильтра не видно
...
Рейтинг: 0 / 0
Оптимизация EF Core 2.0
    #39676774
gr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gr
Гость
Shocker.Pro,

EF Core берет из БД все записи из обоих таблиц:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT [a].[No], [a].[AccountType], [a].[Blocked], [a].[DirectPosting], [a].[Indentation], [a].[Name], [a].[Totaling], [a].[Type],
 [g].[EntryNo], [g].[AccountNo], [g].[Amount], [g].[BalAccountNo], [g].[BalAccountType], [g].[Description], [g].[DocumentDate], 
[g].[DocumentNo], [g].[PostingDate], [g].[SourceNo], [g].[SourceType]
FROM [PR_Accounts] AS [a]
LEFT JOIN [PR_GLEntries] AS [g] ON [a].[No] = [g].[AccountNo]
ORDER BY [a].[No]



А мне нужны все записи из первой и суммы по второй. В первой всего несколько десятков записей, а во второй сотни тысяч...
Код: sql
1.
2.
3.
4.
5.
6.
SELECT [No]
      ,[Name]
      ,(select sum([Amount])
	    from [dbo].[PR_GLEntries] G
		where G.[AccountNo] = A.No)
  FROM [Pronet2].[dbo].[PR_Accounts] A
...
Рейтинг: 0 / 0
Оптимизация EF Core 2.0
    #39676789
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EF Core не умеет даже Groupby, не умеет и проекции нормально делать, увы
...
Рейтинг: 0 / 0
Оптимизация EF Core 2.0
    #39676797
gr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gr
Гость
Shocker.Pro,

Не, самые простые запросы он группирует. Вот такой запрос он нормально обрабатывает:
Код: c#
1.
2.
3.
4.
var accsSum = (from o in db.PR_GLEntries
                           where o.PostingDate <= reportDate
                           group o by o.AccountNo into os
                           select new AccountSumShort { AccountNo = os.Key, Sum = os.Sum(o => o.Amount) });



Он его преобразует в запрос вида:
Код: sql
1.
2.
3.
4.
5.
exec sp_executesql N'SELECT TOP(1) [o].[AccountNo], SUM([o].[Amount]) AS [Sum]
FROM [PR_GLEntries] AS [o]
WHERE [o].[PostingDate] <= @__reportDate_0
GROUP BY [o].[AccountNo]
HAVING [o].[AccountNo] = @__acc_No_1',N'@__reportDate_0 datetime2(7),@__acc_No_1 nvarchar(4000)',@__reportDate_0='2018-07-20 00:00:00',@__acc_No_1=N'11000110'



Вот только у меня он падает на преобразовании из decimal(SQL) в decimal(Net).
А если пишу:
Код: c#
1.
2.
3.
4.
var accsSum = (from o in db.PR_GLEntries
                           where o.PostingDate <= reportDate
                           group o by o.AccountNo into os
                           select new AccountSumShort { AccountNo = os.Key, Sum = os.Sum(o => (double)o.Amount) });


То запрос выполняется, но начинается выборка по строчкам :(
...
Рейтинг: 0 / 0
Оптимизация EF Core 2.0
    #39676813
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gr,
ОРМ для CRUD учетного ПО.
Раньше или позже при аналитике вы упретесь в оверхед.
У вас задача - аналитика.
...
Рейтинг: 0 / 0
Оптимизация EF Core 2.0
    #39676880
gr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gr
Гость
Petro123,

Спасибо. Значит все таки буду смотреть Ado.net
...
Рейтинг: 0 / 0
Оптимизация EF Core 2.0
    #39676930
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grPetro123,

Спасибо. Значит все таки буду смотреть Ado.net
Задачу то мы не видим. Есть отчетники с прямым sql запросом внутри. Есть хранимки, вьюхи и т.д.
Сам смотри.
...
Рейтинг: 0 / 0
Оптимизация EF Core 2.0
    #39678823
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Оптимизация EF Core 2.0
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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