我有这个项目:
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; }
}
最后是 Inventory Items,它有 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
in INVENTORY_PACK
。如果这三个值相同,那么我们可以考虑拥有相同的孩子。我基本上需要搜索与我现在拥有的相同的任何包(使用 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();
}
}
例子
我认为我需要澄清我的需求。这是一个例子。
假设我有 1PACK
包含 2 INVENTORY_PACK
: 1 是具有INVENTORY
1234、4321 INVENT_IDE
、CARD_IDE
is QTY
1 和INVENT_ITEM_STATE
is的项目PERFECT
。第二个对象是INVENT_IDE
4567、7654 CARD_IDE
、QTY
是 2 和INVENT_ITEM_STATE
PERFECT
。
我需要检查包以查看是否已经有一个包包含所选参数中的两个项目。所以有很多可能性:
- 如果我们有另一个现有
PACK
的具有相同的项目和相同的项目数量(在本例中为 2)、数量和 IDS,我们有一个完美匹配,我们认为PACK
已经存在; - 如果有一个
PACK
包含相同的项目,但有另一个(本例中为 3 个或更多项目),它是否被视为另一个包;那么我们没有匹配; - 如果任何包裹只有其中一项,我们没有匹配项。