Критерии запроса сущности со статическими элементами экземпляра

Я пытаюсь создать аудиторский след, подобный таблице истории состояния заказа. Таким образом, заказы могут иметь много состояний заказов и одно состояние, которое указывает на самый последний элемент истории. До сих пор так хорошо при сохранении обновления. Проблемы возникают, когда я пытаюсь запросить, как если бы я использовал перечисление:

public class OrderState
{
    public static OrderState Placed = new OrderState("Placed", 1, 1);
    public static OrderState Accepted = new OrderState("Accepted", 10, 2);
    public static OrderState Cancelled = new OrderState("Cancelled", 20, 3);
    public static OrderState Completed = new OrderState("Completed", 30, 4);

    protected OrderState()
    {
    }

    public OrderState(string name, int order, int id)
    {
        Name = name;
        Order = order;
        Id = id;
    }

    public int Id { get; set; }
    public string Name { get; protected set; }
    public int Order { get; protected set; }



    public static bool operator == (OrderState state1, OrderState state2)
    {
        if (ReferenceEquals(state1, null))
        {
            return ReferenceEquals(state2, null);
        }
        return state1.Equals(state2);
    }

    public static bool operator !=(OrderState state1, OrderState state2)
    {
        return !(state1 == state2);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj))
        {
            return false;
        }
        if (ReferenceEquals(this, obj))
        {
            return true;
        }
        if (!(obj is OrderState))
        {
            return false;
        }
        return Equals((OrderState)obj);
    }

    public virtual bool Equals(OrderState other)
    {
        return other.Id.Equals(Id);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            return ((Id.GetHashCode())*397) ^ Order;
        }
    }


}

Класс order

public class Order
{
    public Order()
    {
        Progress(OrderState.Placed);
    }
    public int Id { get; set; }

    public virtual OrderState State
    {
        get { return States.OrderByDescending(x => x.State.Order).FirstOrDefault()?.State; }
    }

    public void Progress(OrderState state)
    {
        if (States.All(x => x.State != state))
        {
            States.Add(new OrderStateHistory()
            {
                Order = this,
                State = state
            });
        }
    }

    public virtual ICollection<OrderStateHistory> States { get; set; } = new List<OrderStateHistory>();
}

В моем коде такие вещи работают хорошо:
order.Progress(OrderState.Accepted);,if (order.State == OrderState.Accepted)

Тем не менее, то, что я хотел бы получить, это Where(x => x.State.Equals(OrderState.Accepted))илиWhere(x => x.State == OrderState.Accepted)

К сожалению, любой из критериев приведет к тому, что «указанное состояние-член типа» не поддерживается в LINQ для сущностей. Поддерживаются только инициализаторы, элементы сущностей и свойства навигации сущностей.’ ошибка.

Я знаю, что мне удалось сделать это с NHibernate. Могу ли я даже сделать это с EF?

1 ответ

  1. Поскольку EF необходимо перевести ваши инструкции LINQ в инструкции SQL,
    ты не можешь этого сделать. Если у вас сложная логика сравнения
    overridden Equals()метод вам придется дублировать, что в
    Заявление LINQ.

    public IQueryable<Foo> FoosEqualTo(IQueryable<Foo> allFoos, Foo target) {
    return from foo in allFoos
           where foo.Id == target.Id // or other comparison logic...
           select foo;
    }
    
    public Foo getFoo(Foo target) {
        return FoosEqualTo(DC.foos, target).FirstOrDefault();
    }