The LINQ expression could not be translated
От: dsalodki Беларусь http://dsalodki.wix.com/resume
Дата: 31.12.21 10:57
Оценка:
Всех с Наступающим!
помогите с исключением, не могу понять из-за чего исключение




    public static class NoLock
    {
        public static List<T> ToListWithNoLock<T>(this IQueryable<T> query, Expression<Func<T, bool>> expression = null)
        {
            List<T> result = default;
            using (var scope = CreateTrancation())
            {
                if (expression != null)
                {
                    query = query.Where(expression);
                }
                result = query.ToList();
                scope.Complete();
            }
            return result;
        }
        private static TransactionScope CreateTrancation()
        {
            return new TransactionScope(TransactionScopeOption.Required,
                                        new TransactionOptions()
                                        {
                                            IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted
                                        },
                                       TransactionScopeAsyncFlowOption.Enabled);
        }
    }


var t = context.Transactions.AsNoTracking().Where(x => x.IdUserIn == ID_USER && ID_USER > 0 && x.State == "N" && (DateTime.Now - x.Created).TotalHours < 24).ToListWithNoLock();



The LINQ expression 'DbSet<Transaction>()
.Where(t => t.IdUserIn == __ID_USER_0 && True && t.State == "N" && (DateTime.Now — t.Created).TotalHours < 24)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

или как иначе на EF CORE переписать
select COUNT(*) from TRANSACTIONS with (nolock) where ((@IP<>0 and ip=@IP) or (@ID_USER>0 and ID_USER_IN=@ID_USER)) and state='N' and datediff(HOUR, CREATED, getdate())<24
Отредактировано 31.12.2021 11:00 dsalodki . Предыдущая версия .
Re: The LINQ expression could not be translated
От: dsalodki Беларусь http://dsalodki.wix.com/resume
Дата: 31.12.21 11:33
Оценка:
EF.Functions.DateDiffHour(DateTime.Now, x.Created) < 24
Re: The LINQ expression could not be translated
От: Danchik Украина  
Дата: 31.12.21 16:45
Оценка:
Здравствуйте, dsalodki, Вы писали:

D>или как иначе на EF CORE переписать

D>
D>select COUNT(*) from TRANSACTIONS with (nolock) where ((@IP<>0 and ip=@IP) or (@ID_USER>0 and ID_USER_IN=@ID_USER)) and state='N' and datediff(HOUR, CREATED, getdate())<24
D>


Что вы так мучаетесь, даже NOLOCK в linq2db есть. И это он бы оттранслировал без исключения.
Re[2]: The LINQ expression could not be translated
От: VladCore  
Дата: 31.12.21 17:57
Оценка: -1
Здравствуйте, Danchik, Вы писали:

D>>или как иначе на EF CORE переписать

D>>
D>>select COUNT(*) from TRANSACTIONS with (nolock) where ((@IP<>0 and ip=@IP) or (@ID_USER>0 and ID_USER_IN=@ID_USER)) and state='N' and datediff(HOUR, CREATED, getdate())<24
D>>


D>Что вы так мучаетесь, даже NOLOCK в linq2db есть. И это он бы оттранслировал без исключения.


он эскьюэльный (@IP<>0 and ip=@IP) на LINQ написал как x.IdUserIn == ID_USER && ID_USER > 0

ты не видишь? ну и or поменял на and зачемто. я не удивлюсь что это намеренно и для этого есть причина где то в знаниях.
Re[2]: The LINQ expression could not be translated
От: Sinclair Россия http://corp.ingrammicro.com/Solutions/Cloud.aspx
Дата: 31.12.21 20:53
Оценка: +2
Здравствуйте, dsalodki, Вы писали:

D>EF.Functions.DateDiffHour(DateTime.Now, x.Created) < 24

Не надо так делать. Делайте where x.Created > (DateTime.Now — TimeSpan.FromHours(4))
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
http://rsdn.org/File/5743/rsdnaddict.GIF
Re: The LINQ expression could not be translated
От: DDDX Россия http://www.ibprovider.com
Дата: 03.01.22 12:45
Оценка:
Здравствуйте, dsalodki, Вы писали:

D>помогите с исключением, не могу понять из-за чего исключение


D>The LINQ expression 'DbSet<Transaction>()

D> .Where(t => t.IdUserIn == __ID_USER_0 && True && t.State == "N" && (DateTime.Now — t.Created).TotalHours < 24)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

Я не видел транслятора TimeSpan::TotalHours у какого-либо EFCore провайдера ...
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.