2013-08-27 23 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 

}