动态Linq on DataTable错误:DataRow中没有字段或属性,c#

时间:2015-12-02 21:17:21

标签: linq datatable

我在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;

任何人都可以帮我解决这个问题吗?我觉得这可能是一个非常简单的语法变化,但我现在还不知道。

1 个答案:

答案 0 :(得分:0)

首先,此行有错误

orderby zz.Field<string>("ID")

因为正如您所说,您的ID列的类型为int

其次,您需要学习LINQ查询语法。忘记字符串,就像在查询中使用fromorderbyselect一样,您也可以使用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"));