我需要在项目表格中显示 ItemID 和ItemName。假设 ItemID 为002, ItemName 为Apple。我在表格中有另一个名为 SupplementaryItems 的字段,用于存储相关的 ItemID 。 (分隔符),类似 003 | 004 | 005 。我正在使用带有存储库模式的MVC3,类似于
var items = _dataContext.items.AsQueryable();
items = from i in items
where i.Item_ID.equals(itemId)
select i;
使用itemId 002的上述查询将返回Apple,它可以正常工作。现在,我还需要显示所有的additionalItems及其对应的ItemName,这意味着我需要将supplementItem拆分为数组,并使用像optionalItemArray这样的包含itemID的东西。但在这种情况下,我需要对数据库进行两次单独的调用,第一次只返回带有itemID的项目,其中我将suppleItemID存储在变量中。
var supplementMaterialsArr = supplementMaterials.ToString().Split('|');
,第二个将返回所有项目,我将遍历第二个项目以从ItemID获取ItemName。仅供参考,这种方法需要从控制器进行两次单独调用,例如
var itemInformationAll = _repository.GetAllItems();
var itemInformation = _repository.GetItemDetailInformation(id);
我认为这不是那么有效的方法。有人有更好的解决方案吗?我应该使用LINQ自联接吗?但是,如果我使用自联接,我是否能够使用单个查询获取带有相应ItemName的supplemetaryItem? 任何建议都将受到高度赞赏。
答案 0 :(得分:1)
这是我能想到的最好的。它将导致两个查询,但绝不会将整个表拉入内存。
var q = from item in
(from item in TblItems
where item.ItemID == 1
select new
{
Name = item.ItemName,
SupplementaryItems = item.SupplementaryItems.Split('|')
}).AsEnumerable()
select new
{
Name = item.Name,
SupplementaryItems = TblItems.Where (x =>
item.SupplementaryItems.Select(y => int.Parse(y))
.Contains(x.ItemID))
};
但我建议更改数据库结构,以便为引用项目提供单独的表格。