2012-07-03 74 views
2

我试图筛选数据表与下面的代码“无效的演员”在LINQ

private void Filter(string text) 
    { 
     int outText=0; 
     if (Int32.TryParse(text, out outText)) 
     { 
      text = string.Empty; 
     } 
    DataTable DT = new DataTable(); 
      DT = PinCDAO.GetArea().AsEnumerable().Where(r => r.Field<int>("AreaID")==Convert.ToInt32(outText) || (r.Field<string>("AreaDescription").Contains(text))).AsDataView().ToTable(); 

} 

我收到错误“指定的转换无效”。由于代码

r => r.Field<int>("AreaID")==Convert.ToInt32(outText) 

我敢肯定,AreaID列包含整数

PLZ帮助我解决这个问题。

+2

你为什么要叫'Convert.ToInt32(输出文本)''时为outText'已经整数? – leppie

+1

其中一个记录是否有空“AreaID”? –

+0

确实AreaID允许空值?你能告诉我们更多关于它吗? –

回答

2

试用代码 - 在你的代码处理空

因为 “areaID表示” 为空场。

DT = PinCDAO.GetArea().AsEnumerable().Where(r => 
    (Convert.IsDBNull(r["AreaID"]) ? 0 : Convert.ToInt32(r["AreaID"])) ==outText 
    || (r.Field<string>("AreaDescription").Contains(text))).AsDataView().ToTable(); 

这个代码很容易处理空值..

已经回答了我的问题:"Specified cast is not valid" error in LINQ's orderby clause

+0

他没有提及AreaID是空。他呢? –

+0

@ ebad86 - 但这种问题主要发生在数据库的可空字段中......我在我的代码蛾中发现了同样的问题,这很容易解决问题... –

+0

@ ebad86 - 请检查:http:// stackoverflow .com/questions/10885837/specified-cast-is-not-valid-error-in-linqs-orderby-clause –

1

删除Convert.ToInt32,输出文本已被解析为INT使用if (Int32.TryParse(text, out outText))

DT = PinCDAO.GetArea().AsEnumerable() 
      .Where(r => r.Field<int>("AreaID")==outText 
          || (r.Field<string>("AreaDescription") 
      .Contains(text))).AsDataView().ToTable(); 

的原因,你所得到的例外可能是“areaID表示”可能不包含一个int值

+0

仍然得到相同的错误 – chamara

+0

放一个断点,看看你的表内有什么,字段“AreaID”包含整数值或其他? – Habib

+0

或尝试r.Field (“AreaID”),如果它是可空的 – Habib

1

你不”吨需要转换为int为已经声明为intoutText ....你可以简单地以下列方式使用outText

r => r.Field<int>("AreaID")==outText 

您可以按以下方式改变expresson:通过

r => Convert.ToInt32(r["AreaID"])==outText 
+0

仍然得到相同的错误 – chamara

+0

我已经更新了答案...有一个尝试与那一个...... –

1

变量作为输出变量不需要之前被传递初始化。此外,outtext不需要转换为Int32,因为它已经是一个了。

private void Filter(string text)  {  
    int outText;   
      if (Int32.TryParse(text, out outText))   
        { 
        // text was integer and parsed successfully.    
        text = string.Empty;  
        }  
DataTable DT = new DataTable(); 
      DT = PinCDAO.GetArea().AsEnumerable().Where(r => r.Field<int>("AreaID")== outText || (r.Field<string>("AreaDescription").Contains(text))).AsDataView().ToTable(); }