2013-04-30 79 views
0

我是编写LINQ查询的新手,并且遇到字符串比较问题。我正在将数据加载到DataTable中(确认SQL DB和DataTable中的表具有相同的行数),但出于某种原因,我无法找到我知道存在的值。LINQ查询不返回行中的字符串比较

文本框中包含“服务器名称”,而数据行包含“servername.mydomain.net”,所以这里就是我的代码看起来像

string strParameter = txtAutoComplete.ToString().ToLower(); 

    //WUG TableAdapter and DataTable 
    dsCIInfoTableAdapters.DeviceTableAdapter taWUG; 
    taWUG = new dsCIInfoTableAdapters.DeviceTableAdapter(); 

    dsCIInfo.DeviceDataTable dtWUG = new dsCIInfo.DeviceDataTable(); 
    taWUG.Fill(dtWUG); 

    var qstWUG = (from row in dtWUG.AsEnumerable() 
        where row.Field<string>("sDisplayName").ToLower().Contains(strParameter) 
        select row.Field<string>("sDisplayName")); 
+0

也许strParameter具有在年底或东西)就可以了多余的空格,也许尝试修剪( 。并在linq语句中做一个字符串== – cgatian 2013-04-30 19:15:08

+0

啊,我看到它的自动完成,忽略关于字符串相等的最后部分 – cgatian 2013-04-30 19:17:00

+0

这真的是where子句不工作,如果我拿出where子句有4426行返回,哪是相同数量的行在DB – 2013-04-30 19:45:39

回答

0

是啊,我觉得愚蠢......我忘了使用textbox.text将其分配到一个字符串

string strParameter = txtAutoComplete.Text.ToLower(); 


     //WUG TableAdapter and DataTable 
     dsCIInfoTableAdapters.DeviceTableAdapter taWUG; 
     taWUG = new dsCIInfoTableAdapters.DeviceTableAdapter(); 

     dsCIInfo.DeviceDataTable dtWUG = new dsCIInfo.DeviceDataTable(); 
     taWUG.Fill(dtWUG); 

     var qstWUG = (from row in dtWUG.AsEnumerable() 
         let display = row.Field<string>("sDisplayName") 
         where display.ToLower().Contains(strParameter) 
         select display).ToArray(); 
+0

好吧,不要觉得不好,我坐在那里看着它,我也错过了。哦,很高兴你找到了你的答案。 – Bearcat9425 2013-04-30 20:09:54

0

Beleive在LINQ声明dtWUG必须dtWUG.AsEnumerable( )。 Linq仅适用于实现IEnumerable接口的数据源。

+0

是的,他的代码应该是错误的,但它看起来像它的一个DeviceDataTable ...不管怎么说,也许它确实实现IEnumerable – cgatian 2013-04-30 19:12:44

+0

对不起,在我急于尝试并获得某些工作,我已经删除了它,并没有使它成为我的代码示例。我目前在我的代码中使用.AsEnumerable() – 2013-04-30 19:38:08

+0

啊我看到了,你是只想选择那个特定的值还是整个行对象。你可以尝试选择新的{ServerName = p.Field (“sDisplayName”)}。然后在qstWUG上迭代时,您可以通过qstWUG.Server.ToString()访问服务器。如果你需要整行关联,我会改变它来选择行。然后,当迭代时,您可以访问与该服务器名称关联的其他字段值。 – Bearcat9425 2013-04-30 19:58:30

0

可以调试它更容易,如果你添加一些let语句,您可以添加断点:

var qstWUG = (from row in dtWUG 
        let display = row.Field<string>("sDisplayName") 
        let lower = display.ToLower() 
        let contains = lower.Contains(strParameter) 
        where contains 
        select display).ToArray(); 

而且其转换为最终使用.ToArray()阵列,将使其立即执行(LINQ是懒惰范式,直到需要时才执行),并且在随后的断点中也更容易查看。

+1

为什么downvote?他在解决方案中使用了这个概念。 – 2013-04-30 20:41:10