我是编写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"));
答案 0 :(得分:0)
在你的LINQ语句中相信dtWUG需要是dtWUG.AsEnumerable()。 Linq仅适用于实现IEnumerable接口的数据源。
答案 1 :(得分: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由范例延迟,直到需要时才执行),并且在后续断点中也更容易查看。
答案 2 :(得分: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();