2011-05-04 49 views
0

我想基於傳遞的列來獲取行的存在。該列作爲MultiSelect來自數據庫。LINQ - 指定的轉換不適用於dataview的使用

bool bCFPresent = IsMultiSelectCFPresent(dvDataTag, "MultiSelect"); 


public static bool IsPresent(DataView dvDataTag, string colName) 
{ 
    return ((from DataRowView drv in dvDataTag 
        where drv.Row.Field<short>(colName) == 1 
        select drv).Count() > 0 ? true : false); 
} 

但我收到此錯誤: -

System.InvalidCastException was unhandled by user code
Message="Specified cast is not valid." Source="System.Data.DataSetExtensions" StackTrace: at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value) at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName)

請幫助。

+0

什麼類型是 'COLNAME' 在DB? – 2011-05-04 12:04:55

回答

1

這個問題似乎是一個名爲colName列的類型不能澆鑄爲短...
總體而言,你的代碼似乎並沒有讓一大堆的道理。每列的行數是相同的。相反,嘗試直接檢查之列,如這樣的:

public static bool IsPresent(DataView dvDataTag, string colName) 
{ 
    return dvDataTag.Table.Columns.Cast<DataColumn>(). 
             Any(c => c.ColumnName == colName); 
} 
+0

此列在數據集中的值爲0或1。一些奇怪的事情正在發生.. – Karan 2011-05-04 10:39:20

+0

我想獲得colName值爲1的行數。 – Karan 2011-05-04 10:44:57

+0

所以,你真正想要的是:'select count(*)from table where colName = 1'?這應該與您的原始代碼一起工作。也許嘗試使用'int'而不是'short'? – 2011-05-04 10:53:54

0

我真的不知道你想什麼你謂語

drv.Row.Field<short>(colName) == 1 

做,但你IsPresent方法可以改寫爲

更新:

public static bool IsPresent(DataView dvDataTag, string colName) 
{ 

     return dvDataTag.Any(drv => string.Equals("1",drv[colName].ToString())); 
} 

作爲行記

int count = dvDataTag.Count(drv => string.Equals("1",drv[colName].ToString())); 

PS:零點處理留給OP

+0

我想獲得colName值爲1的行數。請提供代碼.. – Karan 2011-05-04 10:48:30

+0

但是,在謂詞中定義了drv .. – Karan 2011-05-04 11:00:35

+0

drv不需要定義。這不是使用lamdas的樂趣嗎? :) – abhilash 2011-05-04 12:26:54