我在DataTable上使用Linq时遇到一些错误,我无法弄清楚如何解决它。我不得不承认我对Linq很新,我搜索了论坛和互联网并且无法弄明白。希望你能提供帮助。
我有一个名为campaign
的DataTable,有三列:ID
(int),Product
(字符串),Channel
(字符串)。 DataTable已经填充了数据。我正在尝试选择满足最终用户选择条件的广告系列记录的子集。例如,用户只想列出产品是否为EWH'或者' HEC'。选择标准由最终用户动态确定。
我有以下C#代码:
private void btnClick()
{
IEnumerable<DataRow> query =
from zz in campaign.AsEnumerable()
orderby zz.Field<string>("ID")
select zz;
string whereClause = "zz.Field<string>(\"Product\") in ('EWH','HEC')";
query = query.Where(whereClause);
DataTable sublist = query.CopyToDataTable<DataRow>();
}
但它在线上给我一个错误:query = query.Where(whereClause)
,说
没有财产或字段&#39; zz&#39;存在于&#39; DataRow&#39;&#34;中。
如果我改为:
string whereClause = "Product in ('EWH','HEC')";
会说:
没有财产或字段&#39;产品&#39;存在于&#39; DataRow&#39;
中
任何人都可以帮我解决这个问题吗?我觉得这可能是一个非常简单的语法变化,但我现在还不知道。
答案 0 :(得分:0)
首先,此行有错误
orderby zz.Field<string>("ID")
因为正如您所说,您的ID
列的类型为int
。
其次,您需要学习LINQ查询语法。忘记字符串,就像在查询中使用from
,orderby
,select
一样,您也可以使用where
和许多其他运算符。此外,您还需要了解SQL-ish的等效LINQ结构,例如IN (...)
映射到Enumerable.Contains等。
尽管如此,这是您的查询
var productFilter = new[] { "EWH", "HEC" };
var query =
from zz in campaign.AsEnumerable()
where productFilter.Contains(zz.Field<string>("Product"))
orderby zz.Field<int>("ID")
select zz;
更新根据您的评论,如果您想使其动态化,那么您需要切换到lambda语法。可以通过链接多个and
子句来组合多个Where
条件
List<string> productFilter = ...; // coming from outside
List<string> channelFilter = ...; // coming from outside
var query = campaign.AsEnumerable();
// Apply filters if needed
if (productFilter != null && productFilter.Count > 0)
query = query.Where(zz => productFilter.Contains(zz.Field<string>("Product")));
if (channelFilter != null && channelFilter.Count > 0)
query = query.Where(zz => channelFilter.Contains(zz.Field<string>("Channel")));
// Once finished with filtering, do the ordering
query = query.OrderBy(zz => zz.Field<int>("ID"));