Выражение LINQ не может быть переведено о сумме TimeSpan свойства

У меня есть таблица с именем CourseEpisode, у которой есть другое свойство, одно из них - TimeSpan

   public TimeSpan time{ get; set; }

когда я пытаюсь получить сумму времени эпизода с помощью этого кода:

    var TotalTime = new TimeSpan(c.CourseEpisods.Sum(e => e.time.Ticks))

когда я запускаю свой проект, я сталкиваюсь с этой ошибкой:

InvalidOperationException: выражение LINQ '(EntityShaperExpression: EntityType: CourseEpisod ValueBufferExpression: (ProjectionBindingExpression: EmptyProjectionMember) IsNullable: False) .Time.Ticks' не может быть переведено. Либо перепишите запрос в форме, которая может быть переведена, либо явно переключитесь на оценку клиента, вставив вызов либо AsEnumerable (), ToList (), либо ToListAsync ()

пожалуйста, помогите мне


person hamed    schedule 24.09.2020    source источник
comment
ваша проблема очень похожа на вопрос здесь: stackoverflow.com/questions/62457480/ в основном свойство Ticks доступно только в C # TimeSpan, в SQL нет соответствующей концепции, поэтому EF не может преобразовать это в SQL. Вам нужно вызвать ToList (), чтобы вернуть все и выполнить Sum из клиентского кода C #   -  person Phuong Nguyen    schedule 25.09.2020
comment
На какой тип базы данных вы ориентируетесь? например SqlServer и т. Д.   -  person Ivan Stoev    schedule 25.09.2020
comment
@PhuongNguyen Во-первых, вы не знаете, как TimeSpan отображается в базе данных. Например, поставщик SqlServer EFC сопоставляет его с time. И пока нет Ticks, у него есть миллисекунды (микросекунды и даже наносекунды), которых должно хватить. Почему для EF Core вопрос заключается в том, какой тип базы данных нацелен. Переход к оценке клиентов - это последнее средство.   -  person Ivan Stoev    schedule 25.09.2020


Ответы (1)


вот пример

void Main()
{   
    var table = new List<TimeSpan> 
                {
                    new TimeSpan(1,0,0),
                    new TimeSpan(0,30,0),                   
                    new TimeSpan(2,0,0),
                    new TimeSpan(0,0,10)
                };
                
    
    TimeSpan total = TimeSpan.Zero;
    table.ForEach(t => total = total.Add(t) );  
    
    Console.WriteLine($"Total Duration Is  = {total.ToString()}");
}

Тогда вы получите

Total Duration Is  = 03:30:10
person Atul Chinchalkar    schedule 25.09.2020
comment
Работа со списком (сбор памяти) и базой данных - это совершенно разные вещи, поэтому ваш пример вне контекста (бесполезен). - person Ivan Stoev; 25.09.2020