【问题标题】:LINQ to get the field values seperated by delimiterLINQ 获取由分隔符分隔的字段值
【发布时间】:2011-05-31 16:23:21
【问题描述】:

我有一种情况需要显示 Items 表中的 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,它工作正常。现在,我还需要显示所有的补充项目及其对应的项目名称,这意味着我需要将补充项目拆分为数组并使用补充项目数组包含项目ID 之类的东西。但是在这种情况下,我需要对数据库进行两次单独的调用,第一次调用将只返回带有 itemID 的项目,其中我将补充项目 ID 存储在变量中。

 var supplementMaterialsArr = supplementMaterials.ToString().Split('|');

第二个将返回所有项目,我将遍历第二个以从 ItemID 中获取 ItemName。仅供参考,这种方法需要从控制器进行两次单独的调用,例如

var itemInformationAll = _repository.GetAllItems();
var itemInformation = _repository.GetItemDetailInformation(id); 

我认为这不是那么有效的方法。有人对此有更好的解决方案吗?我应该使用 LINQ 自加入吗?但是,如果我使用自联接,我能否通过单个查询获得具有相应 ItemName 的 supplemetaryItem? 任何建议将不胜感激。

【问题讨论】:

  • 您有什么理由不创建另一个表来存储补充项目而不是将它们塞进一个字段中?它会让你的事情变得更容易。
  • 创建数据库不在我手中。数据库管理员做到了,我要解决这个问题。

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


【解决方案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))
        };

不过,我建议更改数据库结构,以便为引用项创建一个单独的表。

【讨论】:

  • 查看生成的 SQL,[String.Split] 是在 SQL 语句之外完成的,因此除非您编写存储过程,否则似乎只有两个查询是唯一的选择。最终,如前所述,单独的表格会容易得多。
  • 谢谢!我会试试你的方法。 @MiG - 是的,有两个单独的查询,我得到了这个工作。但是,我担心这里的效率。所以,我也在考虑替代解决方案。目前的解决方案是这样的var items = _dataContext.items.AsQueryable();var suppItems = from i in items where i.Item_ID.Equals(itemId) select i.Supp_Items;然后将suppItems拆分成数组var tempSup = suppItems.Split('|');然后调用另一个查询query2 = from i in items where tempSup.Contains(i.Item_ID) select i;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 2015-08-02
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 1970-01-01
相关资源
最近更新 更多