2015-08-08 66 views
-1

我有,有一个数据集有这些栏目和数据,看起来像这样:VB.net LINQ的数据表中查询

name : path :   bow_Id : midfront_Id : midback_Id : stern_id 
gun1 guns\guns_1  0 
gun2 guns\guns_1  0 
gun3 guns\guns_1  0 
gun4 guns\guns_1  0 

Id喜欢使用名为“关键”的字符串变量来选择“_id之一'列,并只返回与'name'列中传递的字符串匹配的'路径'。 我尝试了几个例子,放弃了..

为了填补我在一个XML字符串读像这样的数据集:

dress_dataset.ReadXml(Application.StartupPath + "\WoWs_Scripts\" + s_name + ".xml") 

这里是一些XML的我载:

<JSB018_Yamato_1944.xml> 
<sections> 
<bow> 
    <model>japan\ship\battleship\JSB018_Yamato_1944\JSB018_Yamato_1944_bow_ports.model</model> 
    <node> 
     <name>MP_JM025JSB018Bow_0_0</name> 
     <model>japan\misc\JM025JSB018Bow\JM025JSB018Bow.model</model> 
    </node> 
    <node> 
     <name>MP_JM026JSB018Bow_0_0</name> 
     <model>japan\misc\JM026JSB018Bow\JM026JSB018Bow.model</model> 
    </node> 
    <node> 
     <name>MP_JM029JSB018Bow_0_0</name> 
     <model>japan\misc\JM029JSB018Bow\JM029JSB018Bow.model</model> 
    </node> 
    <node> 
     <name>MP_JM033JSB018Bow_0_0</name> 
     <model>japan\misc\JM033JSB018Bow\JM033JSB018Bow.model</model> 
    </node> 
    <node> 
     <name>MP_JM109_Deck_Hatch_11</name> 
     <model>japan\misc\JM109\JM109.model</model> 
    </node> 
    <node> 
     <name>MP_JM310_Chrysanthemum_full</name> 
     <model>japan\misc\JM310\JM310.model</model> 
    </node> 
    <node> 
     <name>MP_CM086JSB018Bow_0_0</name> 
     <model>common\misc\CM086JSB018Bow\CM086JSB018Bow.model</model> 
    </node> 
    <node> 
     <name>MP_CM087JSB018Bow_0_0</name> 
     <model>common\misc\CM087JSB018Bow\CM087JSB018Bow.model</model> 
    </node> 
    <node> 
     <name>HP_Fire_Burn_1</name> 
     <model>UNKNOWN_ITEM</model> 
    </node> 
</bow> 

我在这个数据中有很多条目,所以如果还有更快的方法来做到这一点,比凌会更酷。 感谢您的帮助 我应该加..如果列有一个零val,它是该部分的一部分。其他方面,其无效。

+0

请显示您的尝试。你在用什么数据库?你使用什么对象来提取数据 - “ADO.Net”,“实体框架”等... – OneFineDay

+0

VB VS2013赢得7个应用程序。我的代码是无用的.. 让我更新这个问题。 –

+0

哇,好的工作不回答我的任何问题 - 这是你的问题获得答案所必需的。显示你的代码告诉你这里不是勺子饲料代码,并给它一个尝试。 – OneFineDay

回答

2

试试这个。您可以使用GroupBy()将所有相同的路径组合在一起比使用字典,以便您可以按键查找

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("name", typeof(string)); 
      dt.Columns.Add("path", typeof(string)); 
      dt.Columns.Add("bow_ID", typeof(int)); 
      dt.Columns.Add("midfront_ID", typeof(int)); 
      dt.Columns.Add("midback_ID", typeof(int)); 
      dt.Columns.Add("stern_ID", typeof(int)); 

      dt.Rows.Add(new object[] {"gun1","guns\\guns_1", 0}); 
      dt.Rows.Add(new object[] {"gun2","guns\\guns_2", 0}); 
      dt.Rows.Add(new object[] {"gun3","guns\\guns_1", 0}); 
      dt.Rows.Add(new object[] {"gun4","guns\\guns_2", 0}); 

      List<DataRow> filter = dt.AsEnumerable() 
       .Where(x => x.Field<string>("path") == "guns\\guns_1") 
       .ToList(); 

      //use dictionary 
      Dictionary<string, List<DataRow>> dict = dt.AsEnumerable() 
       .GroupBy(x => x.Field<string>("path"), y => y) 
       .ToDictionary(x => x.Key, y => y.ToList()); 

      List<DataRow> guns_1 = dict["guns\\guns_2"]; 
     } 
    } 
} 
​ 
+0

让我试试看..我在这里没有快到哪里。 –

+0

嘿..谢谢..我将它转换为VB并更改了第一行..实际上我需要从匹配输入sting,name_到列'name'的路径 如果我理解这个..但是此行挂起 \t \t Dim filter As List(Of DataRow)= t.AsEnumerable()。Where(Function(x)x.Field(Of String)(“name”)= name _)。ToList() –

+0

您已将标签标记为Vb .net和C#,所以我不确定你真的需要哪种语言。你正确地转换了代码。没有理由挂它。你有数据集还是数据表?如果设置了数据,则ds.table(0)。 – jdweng