Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Linq SQL Отбор по дате / 22 сообщений из 22, страница 1 из 1
19.07.2018, 16:18
    #39676318
gr
gr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
Есть класс, соответствующий представлению в БД:
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 };
То выполняется нормально.

Проблема решена, но хочу понять, в чем причина возникновения ошибки? А то есть подозрение, что это действие сильно замедлит работу...
...
Рейтинг: 0 / 0
19.07.2018, 17:13
    #39676364
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
...
Рейтинг: 0 / 0
19.07.2018, 17:15
    #39676367
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
Код: c#
1.
2.
3.
4.
var myDate=new DateTime(2018, 1, 1)

...
where o.PostingDate <= myDate
...
Рейтинг: 0 / 0
19.07.2018, 17:17
    #39676370
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
А вообще странно, не должно быть ошибки? Какая СУБД, какой ОРМ, какой запрос уходит на сервер?
...
Рейтинг: 0 / 0
19.07.2018, 17:21
    #39676373
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
колонка PostingDate в таблице вашей базы данных имеет тип (n)varchar ?
...
Рейтинг: 0 / 0
19.07.2018, 17:36
    #39676387
gr
gr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
MS SQL 2008 (100)
ASP.NET Core 2.1
PostingDate DATETIME NOT NULL

Отправленный запрос пока не могу прочесть. Если не будет идей, то постараюсь его выцепить.
...
Рейтинг: 0 / 0
19.07.2018, 17:47
    #39676398
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
grЕсли не будет идей, то постараюсь его выцепить.в чем проблема? запускай sql-профайлер да смотри.
...
Рейтинг: 0 / 0
19.07.2018, 17:50
    #39676400
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
И ОРМ-то какой? Чистый Linq2SQL или все-таки EFCore?
...
Рейтинг: 0 / 0
19.07.2018, 17:59
    #39676407
gr
gr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
Профайлер не стоит на сервере - надо ставить.

ОРМ - EFCore

P.S.
Кстати, если объявлять переменную, то да - все тоже работает.
Код: c#
1.
2.
3.
4.
var myDate=new DateTime(2018, 1, 1)

...
where o.PostingDate <= myDate
...
Рейтинг: 0 / 0
19.07.2018, 18:23
    #39676425
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
grПрофайлер не стоит на сервере - надо ставить.Зачем он на сервере? Ставь там, где отлаживаешься.

grКстати, если объявлять переменную, то да - все тоже работает.EF попытался создать выражение для формирования даты на сервере и, видимо, облажался. Но нефиг так делать, зачем тебе под каждую строку заново формировать экземпляр даты? SQL бы, конечно, догадался, что функция детерминированная и не стал бы вычислять выражение каждый раз, а вот Linq не догадался бы. Так что сразу надо делать нормально, а не как придется.

ЗЫ: EFCore не поддерживает группировку (по крайней мере не поддерживал в 2.0), кроме того у тебя в промежутке формирование объекта с операциями, которые тоже не оттранслируются в SQL. Так что загляни в профайлер и ты увидишь много неожиданного, например N запросов там, где ты ожидал один. grА то есть подозрение, что это действие сильно замедлит работу
...
Рейтинг: 0 / 0
19.07.2018, 18:43
    #39676440
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
grОРМ - EFCoreв не core есть галка - выбрасывать в консоль реальный запрос.
...
Рейтинг: 0 / 0
20.07.2018, 09:57
    #39676633
gr
gr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
Спасибо.Узнал много интересного.

По поводу ошибки. EF Core формирует такой запрос:
Код: sql
1.
2.
3.
4.
SELECT [o].[EntryNo], [o].[AccountNo], [o].[Amount], [o].[BalAccountNo], [o].[BalAccountType], [o].[Description], [o].[DocumentDate], [o].[DocumentNo], [o].[PostingDate], [o].[SourceNo], [o].[SourceType]
FROM [PR_GLEntries] AS [o]
WHERE [o].[PostingDate] <= '2018-01-01T00:00:00.0000000'
ORDER BY [o].[AccountNo]


А MS SQL выдает ошибку на формат времени :(

Petro123в не core есть галка - выбрасывать в консоль реальный запрос.
А где установить галку. Посмотрел - сходу не нашел. А так было бы проще чем через провайдер.
...
Рейтинг: 0 / 0
20.07.2018, 10:00
    #39676640
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
gr
Код: sql
1.
WHERE [o].[PostingDate] <= '2018-01-01T00:00:00.0000000'

Проверил на MSSQL 2014 - работает это условие, ошибку не выдает
...
Рейтинг: 0 / 0
20.07.2018, 10:05
    #39676644
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
grPostingDate DATETIME NOT NULLхех, с datetime не работает, работает с datetime2
Код: sql
1.
2.
3.
4.
5.
create table #tm (t datetime2 not null)
insert #tm values  ('2017-01-01')
select * from #tm
WHERE t <= '2018-01-01T00:00:00.0000000'
drop table #tm
...
Рейтинг: 0 / 0
20.07.2018, 10:07
    #39676646
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
С datetime работает, если уменьшить количество разрядов в секундах )

По идее, при CodeFirst EF по умолчанию создает поля именно datetime2
...
Рейтинг: 0 / 0
20.07.2018, 10:08
    #39676650
gr
gr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
Решил переделать запрос. И опять ошибка на ровном месте!

Вот запрос:
Код: c#
1.
2.
3.
            var gr = (from o in db.PR_GLEntries
                      group o by o.AccountNo into os
                      select new { AccNo = os.Key, Sum = os.Sum(o => o.Amount) }).ToList();



К базе запрос выглядит так:
Код: sql
1.
2.
3.
SELECT [o].[AccountNo] AS [AccNo], SUM([o].[Amount]) AS [Sum]
FROM [PR_GLEntries] AS [o]
GROUP BY [o].[AccountNo]



В MS SQL - выполняется номально. А вот в программе выдается ошибка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
OverflowException: Conversion overflows.

    System.Data.SqlClient.SqlBuffer.get_Decimal()
    System.Data.SqlClient.SqlBuffer.get_Value()
    System.Data.SqlClient.SqlDataReader.GetFieldValueFromSqlBufferInternal<T>(SqlBuffer data, _SqlMetaData metaData)
    System.Data.SqlClient.SqlDataReader.GetFieldValue<T>(int i)
    lambda_method(Closure , DbDataReader )
    Microsoft.EntityFrameworkCore.Storage.Internal.TypedRelationalValueBufferFactory.Create(DbDataReader dataReader)
    Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable+Enumerator.BufferlessMoveNext(DbContext _, bool buffer)
    Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute<TState, TResult>(TState state, Func<DbContext, TState, TResult> operation, Func<DbContext, TState, ExecutionResult<TResult>> verifySucceeded)
    Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable+Enumerator.MoveNext()
    Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider+ExceptionInterceptor+EnumeratorExceptionInterceptor.MoveNext()
    System.Collections.Generic.List.AddEnumerable(IEnumerable<T> enumerable)
    System.Linq.Enumerable.ToList<TSource>(IEnumerable<TSource> source)
    AccountPlane.Controllers.HomeController.Index(Nullable<DateTime> ReportDate) in HomeController.cs

                var gr = (from o in db.PR_GLEntries

Т.е. ругается на преобразование в decimal.
Amount определено как:
В программе: public decimal Amount { get; set; }
В БД: decimal(38,20)

Что-то раньше у меня таких проблем не было :(
...
Рейтинг: 0 / 0
20.07.2018, 10:11
    #39676653
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
grЧто-то раньше у меня таких проблем не было :(CodeFirst? или DbFirst?
...
Рейтинг: 0 / 0
20.07.2018, 10:18
    #39676659
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
gr,
context.Database.Log = Console.Write;
...
Рейтинг: 0 / 0
20.07.2018, 10:23
    #39676665
gr
gr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
Shocker.Pro,

В Net 4.5.
...
Рейтинг: 0 / 0
20.07.2018, 10:27
    #39676670
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
grВ Net 4.5.Я тоже не сразу узнал, что EFCore и EF - это два разных продукта и EFCore не наследует EF-у, увы.
...
Рейтинг: 0 / 0
20.07.2018, 10:28
    #39676671
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
Shocker.ProgrЧто-то раньше у меня таких проблем не было :(CodeFirst? или DbFirst?я к чему вопрос - EFCore, видимо, ожидает определенный тип столбцов, если вы их ручками создаете, то возникают накладки, как в случае с DateTime
...
Рейтинг: 0 / 0
20.07.2018, 10:30
    #39676676
gr
gr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq SQL Отбор по дате
Shocker.Pro,

Лучше бы они сделали Ado.Net Core - было бы проще...

P.S.
Вопрос решил:
Код: c#
1.
2.
3.
            var gr = (from o in db.PR_GLEntries
                      group o by o.AccountNo into os
                      select new { AccNo = os.Key, Sum = os.Sum(o => (double)o.Amount) }).ToList();



Кастыли, кастыли...
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Linq SQL Отбор по дате / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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