0

私はこのアイテムを持っています:

public partial class PACK
{
    public int PACK_IDE { get; set; }
    public string PACK_DESCR { get; set; }
    public Nullable<System.DateTime> PACK_DATE_CREATED { get; set; }
    public Nullable<System.DateTime> PACK_DATE_MODIFIED { get; set; }
    public Nullable<System.DateTime> PACK_DATE_LAST_CALC { get; set; }
    public decimal PACK_COST { get; set; }
    public int PACK_QTY_POSS { get; set; }
    public string PACK_NOTE { get; set; }
    public int PACK_QTY_SOLD { get; set; }
    public decimal PACK_AVRG_SELL_PRICE { get; set; }
    public Nullable<int> PACK_DESTINATION { get; set; }

    public virtual ICollection<INVENTORY_PACK> INVENTORY_PACK { get; set; }
}

ご覧のとおり、次のような形のインベントリ パックのリストが含まれています。

public partial class INVENTORY_PACK
{
    public int INVENT_PACK_IDE { get; set; }
    public int INVENT_IDE { get; set; }
    public int PACK_IDE { get; set; }
    public int QTY { get; set; }

    public virtual INVENTORY INVENTORY { get; set; }
    public virtual PACK PACK { get; set; }
}

そして最後に、現在重要な 2 つの重要なフィールドを持つインベントリ アイテムです。

public partial class INVENTORY
{
    public int INVENT_IDE { get; set; }
    public Nullable<int> CARD_IDE { get; set; }
    public Nullable<int> INVENT_NB_IN_STOCK { get; set; }
    public Nullable<int> INVENT_NB_QT_SOLD { get; set; }
    public string INVENT_ITEM_STATE { get; set; }

    public virtual CARD CARD { get; set; }
    public virtual ICollection<INVENTORY_PACK> INVENTORY_PACK { get; set; }
}

INVENT_ITEM_STATE実際に新しいパックを保存または作成するとき、 およびCARD_IDEに基づいてまったく同じインベントリ アイテムを持つ実際のパックが存在するかどうかを確認する方法を見つける必要がありQTYますINVENTORY_PACK。これら 3 つの値が同一である場合、同じ子を持つと見なすことができます。私は基本的に、現在持っているものと同じ子であるパックを(LinqまたはLinq-To-Sql呼び出しを使用して)検索する必要がありますが、大規模な驚くべきことを除いて、これを行う方法が本当にわかりませんfor/foreach ループ。

編集

リクエストに応じて、これが私がやろうとしてきたことの例です。

internal void CreatePack(PackInfo _pack)
{
    using (TransactionScope scope = TransactionUtils.CreateTransactionScope())
    {
        try
        {
            var packQry = from pa in mDb.PACK
                          select pa;

            if (!packQry.Any())
            {
                PACK packToAdd = DataConverter.PackInfoToPACKData(_pack);

                mDb.PACK.Add(packToAdd);

                mDb.SaveChanges();

                int packID = mDb.PACK.Max(_x => _x.PACK_IDE);

                foreach (INVENTORY_PACK inventoryPack in packToAdd.INVENTORY_PACK)
                {
                    inventoryPack.PACK_IDE = packID;

                    mDb.SaveChanges();
                }
            }
            else
            {
                List<PACK> listPacks = new List<PACK>();

                foreach (var inventoryPackInfo in _pack.mListInventoryPackInPack)
                {
                    packQry = from pa in mDb.PACK
                              where pa.INVENTORY_PACK.Any(_item =>
                                      _item.INVENTORY.INVENT_IDE ==
                                      inventoryPackInfo.mInventoryItem.mInventoryID)
                              where pa.INVENTORY_PACK.Any(
                                      _item =>
                                      _item.INVENTORY.INVENT_ITEM_STATE ==
                                      inventoryPackInfo.mInventoryItem.mItemState)
                              where pa.INVENTORY_PACK.Any(_item => _item.QTY == inventoryPackInfo.mQuantity)
                              select pa;

                    if (packQry.Any())
                    {
                        listPacks.AddRange(packQry);
                    }
                }

                if (_pack.mListInventoryPackInPack.Count == 1)
                {

                }

                IDictionary<PACK, int> counts = new Dictionary<PACK, int>();

                foreach (var pack in listPacks)
                {
                    if (!counts.ContainsKey(pack))
                    {
                        counts.Add(pack, 1);
                    }
                    else
                    {
                        counts[pack]++;
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }

        scope.Complete();
    }
}

自分の必要性を明確にする必要があると思います。これが例です。

PACK2 を含む1があるとしますINVENTORY_PACK。1 は1234、4321、1 、およびのINVENTORY項目です。2 番目のオブジェクトは4567、7654、2および.INVENT_IDECARD_IDEQTYINVENT_ITEM_STATEPERFECTINVENT_IDECARD_IDEQTYINVENT_ITEM_STATE PERFECT

パッケージをチェックして、選択したパラメーターに正確に 2 つのアイテムを含むパッケージが既に存在するかどうかを確認する必要があります。したがって、多くの可能性があります。

  • PACK同じアイテムと同じアイテム数 (この場合は 2)、数量、IDSを持つ別の存在がある場合、完全に一致PACKし、 が既に存在すると見なします。
  • 同じアイテムを含むがPACK別のアイテム (この例では 3 つ以上のアイテム) がある場合、別のパックと見なされますか? 一致するものはありません。
  • いずれかのパッケージにこれらのアイテムが 1 つしか含まれていない場合、一致するものはありません。
4

2 に答える 2

0

これはおそらくあなたが望むものです

int count = (from p in _pack.INVENTORY_PACK
            where pack.INVENTORY.INVENT_ITEM_STATE == p.INVENTORY.INVENT_ITEM_STATE
            select p).Count();

その後、 if(pack.QTY == count)

于 2013-08-09T16:30:02.310 に答える