0

我是编写 LINQ 查询的新手,但在字符串比较方面遇到了麻烦。我正在将数据加载到 DataTable 中(确认 SQL DB 和 DataTable 中的表具有相同的行数),但由于某种原因,我找不到我知道两者都存在的值。

文本框包含“servername”,而数据行包含“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"));
4

3 回答 3

0

相信您的 LINQ 语句 dtWUG 必须是 dtWUG.AsEnumerable()。Linq 仅适用于实现 IEnumerable 接口的数据源。

于 2013-04-30T19:12:03.500 回答
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();
于 2013-04-30T20:08:01.857 回答
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 在范式上是惰性的,直到需要时才执行),并且在后续断点中也更容易查看。

于 2013-04-30T19:15:02.080 回答