|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
Есть класс, соответствующий представлению в БД: 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; } } Есть запрос: var calc = from o in db.PR_GLEntries where o.PostingDate <= new DateTime(2018, 1, 1) group o by o.AccountNo into os let SumVerb = new { No = os.Key, Name = os.First().Description, Sum = os.Sum(r => r.Amount) } from account in db.PR_Accounts where account.No == SumVerb.No select new AccountSum { Account = account, Sum = SumVerb.Sum }; При его выполнении выдает ошибку: SqlException: Ошибка преобразования даты или времени из символьной строки. А если записать так: var calc = from o in db.PR_GLEntries where o.PostingDate.Date <= new DateTime(2018, 1, 1) group o by o.AccountNo into os let SumVerb = new { No = os.Key, Name = os.First().Description, Sum = os.Sum(r => r.Amount) } from account in db.PR_Accounts where account.No == SumVerb.No select new AccountSum { Account = account, Sum = SumVerb.Sum }; То выполняется нормально. Проблема решена, но хочу понять, в чем причина возникновения ошибки? А то есть подозрение, что это действие сильно замедлит работу... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2018, 16:18 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2018, 17:15 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
А вообще странно, не должно быть ошибки? Какая СУБД, какой ОРМ, какой запрос уходит на сервер? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2018, 17:17 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
колонка PostingDate в таблице вашей базы данных имеет тип (n)varchar ? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2018, 17:21 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
MS SQL 2008 (100) ASP.NET Core 2.1 PostingDate DATETIME NOT NULL Отправленный запрос пока не могу прочесть. Если не будет идей, то постараюсь его выцепить. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2018, 17:36 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
grЕсли не будет идей, то постараюсь его выцепить.в чем проблема? запускай sql-профайлер да смотри. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2018, 17:47 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
И ОРМ-то какой? Чистый Linq2SQL или все-таки EFCore? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2018, 17:50 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
Профайлер не стоит на сервере - надо ставить. ОРМ - EFCore P.S. Кстати, если объявлять переменную, то да - все тоже работает. Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2018, 17:59 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
grПрофайлер не стоит на сервере - надо ставить.Зачем он на сервере? Ставь там, где отлаживаешься. grКстати, если объявлять переменную, то да - все тоже работает.EF попытался создать выражение для формирования даты на сервере и, видимо, облажался. Но нефиг так делать, зачем тебе под каждую строку заново формировать экземпляр даты? SQL бы, конечно, догадался, что функция детерминированная и не стал бы вычислять выражение каждый раз, а вот Linq не догадался бы. Так что сразу надо делать нормально, а не как придется. ЗЫ: EFCore не поддерживает группировку (по крайней мере не поддерживал в 2.0), кроме того у тебя в промежутке формирование объекта с операциями, которые тоже не оттранслируются в SQL. Так что загляни в профайлер и ты увидишь много неожиданного, например N запросов там, где ты ожидал один. grА то есть подозрение, что это действие сильно замедлит работу ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2018, 18:23 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
grОРМ - EFCoreв не core есть галка - выбрасывать в консоль реальный запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2018, 18:43 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
Спасибо.Узнал много интересного. По поводу ошибки. EF Core формирует такой запрос: Код: sql 1. 2. 3. 4.
А MS SQL выдает ошибку на формат времени :( Petro123в не core есть галка - выбрасывать в консоль реальный запрос. А где установить галку. Посмотрел - сходу не нашел. А так было бы проще чем через провайдер. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2018, 09:57 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
gr Код: sql 1.
Проверил на MSSQL 2014 - работает это условие, ошибку не выдает ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2018, 10:00 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
grPostingDate DATETIME NOT NULLхех, с datetime не работает, работает с datetime2 Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2018, 10:05 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
С datetime работает, если уменьшить количество разрядов в секундах ) По идее, при CodeFirst EF по умолчанию создает поля именно datetime2 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2018, 10:07 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
Решил переделать запрос. И опять ошибка на ровном месте! Вот запрос: Код: c# 1. 2. 3.
К базе запрос выглядит так: Код: sql 1. 2. 3.
В MS SQL - выполняется номально. А вот в программе выдается ошибка: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Т.е. ругается на преобразование в decimal. Amount определено как: В программе: public decimal Amount { get; set; } В БД: decimal(38,20) Что-то раньше у меня таких проблем не было :( ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2018, 10:08 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
grЧто-то раньше у меня таких проблем не было :(CodeFirst? или DbFirst? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2018, 10:11 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
gr, context.Database.Log = Console.Write; ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2018, 10:18 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
Shocker.Pro, В Net 4.5. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2018, 10:23 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
grВ Net 4.5.Я тоже не сразу узнал, что EFCore и EF - это два разных продукта и EFCore не наследует EF-у, увы. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2018, 10:27 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
Shocker.ProgrЧто-то раньше у меня таких проблем не было :(CodeFirst? или DbFirst?я к чему вопрос - EFCore, видимо, ожидает определенный тип столбцов, если вы их ручками создаете, то возникают накладки, как в случае с DateTime ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2018, 10:28 |
|
Linq SQL Отбор по дате
|
|||
---|---|---|---|
#18+
Shocker.Pro, Лучше бы они сделали Ado.Net Core - было бы проще... P.S. Вопрос решил: Код: c# 1. 2. 3.
Кастыли, кастыли... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2018, 10:30 |
|
|
start [/forum/topic.php?fid=17&msg=39676676&tid=1349181]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
193ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 237ms |
total: | 537ms |
0 / 0 |