powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Linq SQL Отбор по дате
22 сообщений из 22, страница 1 из 1
Linq SQL Отбор по дате
    #39676318
gr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gr
Гость
Есть класс, соответствующий представлению в БД:
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
Linq SQL Отбор по дате
    #39676364
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Linq SQL Отбор по дате
    #39676367
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
var myDate=new DateTime(2018, 1, 1)

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

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

ОРМ - EFCore

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

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

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

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

По поводу ошибки. 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
Linq SQL Отбор по дате
    #39676640
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gr
Код: sql
1.
WHERE [o].[PostingDate] <= '2018-01-01T00:00:00.0000000'

Проверил на MSSQL 2014 - работает это условие, ошибку не выдает
...
Рейтинг: 0 / 0
Linq SQL Отбор по дате
    #39676644
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Linq SQL Отбор по дате
    #39676646
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С datetime работает, если уменьшить количество разрядов в секундах )

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

Вот запрос:
Код: 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
Linq SQL Отбор по дате
    #39676653
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grЧто-то раньше у меня таких проблем не было :(CodeFirst? или DbFirst?
...
Рейтинг: 0 / 0
Linq SQL Отбор по дате
    #39676659
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gr,
context.Database.Log = Console.Write;
...
Рейтинг: 0 / 0
Linq SQL Отбор по дате
    #39676665
gr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gr
Гость
Shocker.Pro,

В Net 4.5.
...
Рейтинг: 0 / 0
Linq SQL Отбор по дате
    #39676670
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grВ Net 4.5.Я тоже не сразу узнал, что EFCore и EF - это два разных продукта и EFCore не наследует EF-у, увы.
...
Рейтинг: 0 / 0
Linq SQL Отбор по дате
    #39676671
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProgrЧто-то раньше у меня таких проблем не было :(CodeFirst? или DbFirst?я к чему вопрос - EFCore, видимо, ожидает определенный тип столбцов, если вы их ручками создаете, то возникают накладки, как в случае с DateTime
...
Рейтинг: 0 / 0
Linq SQL Отбор по дате
    #39676676
gr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gr
Гость
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
22 сообщений из 22, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Linq SQL Отбор по дате
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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