2016-11-15 53 views
0

我有頁面加載時的默認數據表,進一步當我更改我的頁面上的下拉選擇我想通過使用選定的下拉值循環現有的數據表。Linq查詢與.Contains不返回任何記錄

由於我的下拉菜單是多選下拉菜單,所以很有可能發送多個值來循環數據表。

對於這個scenariao我使用默認數據表上的linq qyery。 像這樣:

var zones = from myRow in ds.Tables[1].AsEnumerable() 
      where myRow.Field<string>("BusinessUnitId").Contains(BUIds) 
      select myRow; 
dt = zones.CopyToDataTable<DataRow>(); 

它完美的下降的單值下降。但是,當多個ID傳遞時,查詢不會返回和行。

注:BUIds是一個字符串變量(例如:「1,2」)。

可有一個人告訴我,我在我的代碼很想念?

+0

什麼是完全在你的案件BUIds?您能否提供更詳細的樣本以及您正在測試的數據? –

+0

如果字符串包含完全給定的子字符串(不是來自BUID的任何單個數字),則String.Contains將計算爲true,在您的示例「0,1,2,3」.Contains(「1,2」)等於true ,但是「0,2,1,3」.Contains(「1,2」)等於false。 –

回答

5

您正在使用包含在錯誤的地點,應該是在BUIds:

var ids = BUIds.Split(','); // get an Id array 
var zones = from myRow in ds.Tables[1].AsEnumerable() 
      where ids.Contains(myRow.Field<string>("BusinessUnitId")) 
      select myRow; 
dt = zones.CopyToDataTable<DataRow>(); 
0

使用​​考慮以下版本:

var idsHashset = new HashSet<string>(BUIds.Split(',')); 

var zones = from myRow in ds.Tables[1].AsEnumerable() 
       where idsHashset.Contains(myRow.Field<string>("BusinessUnitId")) 
       select myRow; 
    dt = zones.CopyToDataTable<DataRow>(); 

這單價值選擇和多個工作值選擇。

它是如何工作的:

  • BUIds,這是一個string去取string[],使用split,其中元件使用,
  • 現在陣中是否含有1個或多個元素,這將永遠分離能夠使用相同的代碼
  • 如果Id的數量很大,請考慮爲O(LogN)和創建一個爲O(1)搜索
0

使用lambda

var zones = ds.Tables[1].AsEnumerable().Where(row => BUIds.Split(',').Contains((string) row["BusinessUnitId"]);