【发布时间】:2016-03-01 00:34:31
【问题描述】:
好的,我发现很多网站都提到了这个问题,但没有一个完全符合我的需要。我有一个程序可以根据我从亚马逊网络服务收集的数据生成大量数据表。我正在尝试编写一个函数,允许我在提供的数据表的任何列中搜索特定字符串。
在我的程序版本 1 中,我根据预定义的表结构手动构建了查询:
newbie = RawEC2Results.AsEnumerable().Where(p => p.Field<string>("AccountID").Contains(FilterTagText.Text) ||
p.Field<string>("Profile").Contains(FilterTagText.Text) ||
p.Field<string>("Region").Contains(FilterTagText.Text) ||
p.Field<string>("Name").Contains(FilterTagText.Text) ||
p.Field<string>("InstanceID").Contains(FilterTagText.Text) ||
p.Field<string>("AvailabilityZone").Contains(FilterTagText.Text) ||
p.Field<string>("Platform").Contains(FilterTagText.Text) ||
p.Field<string>("Status").Contains(FilterTagText.Text) ||
p.Field<string>("Events").Contains(FilterTagText.Text) ||
p.Field<string>("EventList").Contains(FilterTagText.Text) ||
p.Field<string>("Tags").Contains(FilterTagText.Text) ||
p.Field<string>("Priv_IP").Contains(FilterTagText.Text) ||
p.Field<string>("Pub_IP").Contains(FilterTagText.Text) ||
p.Field<string>("Pub_DNS").Contains(FilterTagText.Text) ||
p.Field<string>("State").Contains(FilterTagText.Text) ||
p.Field<string>("vType").Contains(FilterTagText.Text) ||
p.Field<string>("iType").Contains(FilterTagText.Text) ||
p.Field<string>("SecurityGroups").Contains(FilterTagText.Text));
维护起来很繁琐,因为每次更改列以添加新数据时我都必须更新。我可以生成一个字符串以根据任何给定的表生成查询,但不知道如何处理它。
string nocasequery = "p=> ";
int colno = Table2Filter.Columns.Count;
for (int i =0; i < Table2Filter.Columns.Count ;i++)
{
if (i == colno)
{
CASEquery += @"p.Field<string>(""+Table2Filter.Columns[i]+ "").Contains(FilterTagText.Text) ; ";
nocasequery += @"p.Field<string>(""+Table2Filter.Columns[i]+ "").ToLower().Contains(FilterTagText.Text) ; ";
}
那么,有什么想法吗?这不是数据库,我找到的示例不适用于数据表。如果我可以将此字符串传递给 Where 子句,我的工作就完成了。除了手动之外,我无法弄清楚如何以任何其他方式构建此查询,这让 chunkskis 感到震惊。或者是否有一种方法可以告诉 Linq 搜索每一列而无需我明确调用它们?
【问题讨论】: