私はこのアイテムを持っています:
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();
}
}
例
自分の必要性を明確にする必要があると思います。これが例です。
PACK
2 を含む1があるとしますINVENTORY_PACK
。1 は1234、4321、1 、およびのINVENTORY
項目です。2 番目のオブジェクトは4567、7654、2および.INVENT_IDE
CARD_IDE
QTY
INVENT_ITEM_STATE
PERFECT
INVENT_IDE
CARD_IDE
QTY
INVENT_ITEM_STATE
PERFECT
パッケージをチェックして、選択したパラメーターに正確に 2 つのアイテムを含むパッケージが既に存在するかどうかを確認する必要があります。したがって、多くの可能性があります。
PACK
同じアイテムと同じアイテム数 (この場合は 2)、数量、IDSを持つ別の存在がある場合、完全に一致PACK
し、 が既に存在すると見なします。- 同じアイテムを含むが
PACK
別のアイテム (この例では 3 つ以上のアイテム) がある場合、別のパックと見なされますか? 一致するものはありません。 - いずれかのパッケージにこれらのアイテムが 1 つしか含まれていない場合、一致するものはありません。