0

IEquatable インターフェイスを実装する OrderDto クラスがあります。データベースから OrderDto オブジェクトとして取得された注文のリストがあります。このリストはエンド ユーザーによって編集されます... 新しいオブジェクトを追加します。既存のオブジェクトを削除します。既存のオブジェクトの編集。以下を決定する必要があります。

  1. リスト内の新しいオブジェクト。
  2. リスト内の削除されたオブジェクト。
  3. リスト内の編集済みオブジェクト。

これら 3 つの目標について説明するために、次のコードにコメントしました。最初の 2 つは些細なことですが、リストの 3 番目の項目は非常に厄介です。linqを使用して作成できないようです。正しい方向に向けて微調整していただければ幸いです。詳細については、次のコードを参照してください。

ご協力ありがとうございました!マイク

// Get the original list of OrderDtos before the user did anything.
var entityOrders = Mapper.Map<IList<OrderEntity>, IList<OrderDto>>(entity.Orders.ToList());  

// dto.Orders is a parameter that is being used in this code.  It is the list of OrderDto
// objects that the user has modified: Insert, edit, delete.

// Works properly to locate items that were deleted.          
var deletedOrders = entityOrders.Except(dto.Orders);

// Works properly to locate items that were added.
var addedOrders = dto.Orders.Except(entityOrders);

// Determine the list of order objects less new orders in the list.
// The user has already deleted objects, so we don't have to worry
// about them.  This list will contain only items that MAY have 
// been edited.
var potentialChanges = dto.Orders.Except(addedOrders);

// ARGGG!  I cannot seem to get this one to work properly!  As you can see in the 
// definition of the OrderDto, it implements the IEquatable interface.  So, it 
// should be very easy to determine which items in the dto.Orders list have been
// edited as opposed to the original version in the entityOrders list.  What I 
// would like to have is a list of all the OrderDto objects in the dto.Orders list
// that have been modified.  Since OrderDto implements IEquatable, we should be able
// to compare OrderDto objects directly, but I have not been able get it to work.
// Please helP! :)
var changedOrders =
   from dtoOrder in potentialChanges
   let entityOrder = entityOrders.First(x => x.OrderId == dtoOrder.OrderId)
   where entityOrder != null && !dtoOrder.Equals(entityOrder)
   select dtoOrder;

これが OrderDto クラスの定義です...

public class OrderDto : IEquatable<OrderDto>
{
    public long OrderId { get; set; }
    public string DisplayAs { get; set; }

    #region IEquatable
    public override int GetHashCode()
    {
        // Populate with all fields so
        // we can detect when an entity
        // has been edited.
        return 
        (
            (int) OrderId ^ 
            DisplayAs.GetHashCode()
        );

    }

    public override bool Equals(object other)
    {
        return this.Equals(other as OrderDto);
    }

    public bool Equals(OrderDto other)
    {
        // Populate with all fields so
        // we can detect when an entity
        // has been edited.
        return 
        (
            other != null &&
            other.OrderId == this.OrderId &&
            other.DisplayAs == this.DisplayAs 
        );
    } 

    #endregion
}
4

1 に答える 1