2013-08-27 25 views
2

我有一个数据表加载了一些记录,然后我从另一个文件中提取查询,并想检查我在此查询中提取的ID是否存在于我的数据表中。在DataTable上使用LINQ的.Any()

foreach (var item in records) 
{ 
    bool hasit = dt.AsEnumerable().Any(p => p.Field<string>(0) == item.ID); 
    if (!hasit) 
    { 
     //Logic 
    } 
} 

我使用。任何()函数,并期待它是否存在于在记录集的ID相匹配的数据表中的第一个字段的ID返回true。它不断返回假,我错过了什么?有一个更好的方法吗?

+0

尝试设置一个空白枚举到dt.AsEnumerable的'()的结果。任何(p => p.Field (0)== item.ID);'看看你回来了什么。 – bendataclear

+4

也许把'!hasit'改成'hasit'? –

+0

这对于'records'集合中的大量项目来说看起来相当不合适。你可以重写这个使用“where字段0包含在”记录集合“类型查询的”ID“列的列表中吗? – asawyer

回答

1

方法 。任何(p值=> p.Field(0)== item.ID)

IF ANY元素被发现,将返回true。您的发布代码指定您接下来要做的事情是询问

if (!hasit) 
{ 
    //Logic 
} 

这意味着如果(不是任何有它)......这是产生不正确的行为。将其更改为:

if (hasit) 
{ 
    //Logic 
} 

并且您将得到期望的结果。

编辑:荣誉给Cuong Le for the observation.

+1

假设他想要做某些事情,如果有任何元素,可能是他想要运行逻辑,如果没有元素。 – bendataclear

+1

是的,我明白你的意思,但你是正确的,如果不是真的,我想要做逻辑。 – KJ3

-1

我会尝试打破它,看看我能找到的错误:

foreach (var item in records) 
{ 
    var enumer = dt.AsEnumerable(); // <-- Check this to make sure it has elements 
    var filtered = enumer.Any(p => p.Field<string>(0) == item.ID); // <- Check to make sure it has elements 

}