【发布时间】:2013-08-09 15:37:26
【问题描述】:
我有这个项目:
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 找到一种方法来检查是否存在具有完全相同库存项目的实际包在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();
}
}
示例
我认为我需要澄清我的需求。这是一个例子。
假设我有 1 个 PACK 包含 2 个 INVENTORY_PACK:1 是 INVENTORY 项目,INVENT_IDE 1234,CARD_IDE 4321,QTY 是 1,INVENT_ITEM_STATE 是 PERFECT。第二个对象是INVENT_IDE4567,CARD_IDE7654,QTY是2和INVENT_ITEM_STATEPERFECT。
我需要检查包以查看是否已经有一个包包含恰好所选参数中有两个项目。所以有很多可能性:
- 如果我们有另一个现有的
PACK具有相同的项目和相同的项目数量(在本例中为 2)、数量和 IDS,我们有一个完美匹配,我们认为PACK已经存在; - 如果有一个
PACK包含相同的物品,但还有另一个(本例中为 3 件或更多),它是否被视为 另一个包;那么我们没有匹配; - 如果任何包裹中只有其中一项,我们没有匹配项。
【问题讨论】:
-
你能贴一些你试过的代码吗?
-
我会深入研究并尝试给你一些结果,但我对如何比较 2 个对象感到非常困惑,所以我真的不确定比较 2 个对象列表:|
-
依我的拙见,在没有提供理由的情况下标记问题的用户没有帮助。
-
您是否正在尝试确定新
PACK对象集合中的每个INVENTORY_PACK是否与其他对象匹配?我的意思是这三个值在INVENTORY_PACK集合的每个 实例中是否必须相同? -
我正在尝试查找是否所有
INVENTORY_PACK项目都在另一个 PACK 中完全找到。我想我可以举个例子。我会更新我的帖子。
标签: c# linq-to-sql