如何使用 SumAsync 计算 Asp.Net 核心中自定义值对象的总和

问题描述

我有一个具有值对象类型属性的模型,如下所示:

public class Course : AggregateRoot,ISpModel
{
    ...
    public Unsignednumber MaximumCapacity { get; private set; }
    ...
}

其中 Unsignednumber一个包含短值的值对象:

public class Unsignednumber : BaseValueObject<Unsignednumber>
{
    public short Value { get; }
    ...
}

我需要做的是对符合特定条件的课程的所有 MaximumCapacities 求和,但是当我尝试在查询末尾添加 SumAsync(x => x.MaximumCapacity) 时,出现语法错误 the syntax error 当我尝试对其值执行相同操作时,我在运行时遇到 linq 错误

"LINQ 表达式 '(int)(EntityShaperExpression: \r\n EntityType: Course\r\n ValueBufferExpression: \r\n (ProjectionBindingExpression: Outer)\r\n IsNullable: False\r\n).MaximumCapacity .Value' 无法翻译。要么以可翻译的形式重写查询,要么通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。请参阅https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。”

编辑: 下面是遇到问题的Linq Expression:

var query = _dbContext.Courses.AsQueryable();
query = query.Include(x => BunchOfIncludes(x));
var res = await query.Where(x => BunchOfClauses(x)).SumAsync(x => x.MaximumCapacity.Value);

Edit2:上面提到的类:

public abstract class AggregateRoot : Entity
{
    private readonly List<IDomainEvent> _events;
    protected AggregateRoot() => _events = new List<IDomainEvent>();
    public AggregateRoot(IEnumerable<IDomainEvent> events)
    {
        if (events == null) return;
        foreach (var @event in events)
            ((dynamic)this).On((dynamic)@event);
    }
    protected void AddEvent(IDomainEvent @event) => _events.Add(@event);
    public IEnumerable<IDomainEvent> GetEvents() => _events.AsEnumerable();
    public void ClearEvents() => _events.Clear();
}
public interface ISpModel
{
}
public abstract class BaseValueObject<TValueObject> : IEquatable<TValueObject>
        where TValueObject : BaseValueObject<TValueObject>
{
...
    public static bool operator ==(BaseValueObject<TValueObject> right,BaseValueObject<TValueObject> left)
    {
        if (right is null && left is null)
            return true;
        if (right is null || left is null)
            return false;
        return right.Equals(left);
    }
...
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)