LINQ获取由分隔符分隔的字段值

时间:2011-05-31 16:23:21

标签: c# linq-to-sql join self delimiter

我需要在项目表格中显示 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? 任何建议都将受到高度赞赏。

1 个答案:

答案 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))
        };

但我建议更改数据库结构,以便为引用项目提供单独的表格。