user2738335
user2738335

Reputation: 57

LINQ Exception handling

I 'm getting this error: An unhandled exception of type "System.NullReferenceException' occurred in DataReport.exe" in the linq query. Hereafter my code. Any idea how to handle this exception. Thanks.

private void btnFilterBy_Click(object sender, EventArgs e)
{
    var records = 
        from record in data.AsEnumerable()
        where (record.Field<string>(data.Columns[0].ColumnName).Contains(txtBC.Text) && 
               record.Field<string>(data.Columns[1].ColumnName).Contains(txtRM.Text) &&
               record.Field<string>(data.Columns[2].ColumnName).Contains(txtClient.Text) &&
               record.Field<string>(data.Columns[4].ColumnName).Contains(txtProduct.Text) &&
               record.Field<string>(data.Columns[7].ColumnName).Contains(txtSegment.Text) &&
               record.Field<string>(data.Columns[6].ColumnName).Contains(txtMonth.Text))
        select record;
    dataQuery = records.CopyToDataTable();
    dtGridPivot.DataSource = dataQuery;
}

Upvotes: 0

Views: 914

Answers (2)

Kami
Kami

Reputation: 19407

The error indicates one or more of the fields you are requesting are missing. This is probably due to either the data object being null, or one of the Columns missing.

Try adding something like the following lines of code

if (data == null)
   throw new InvalidOperationException("Data is null");

if (data.Columns.Count < 8)
   throw new InvalidOperationException("Invalid number of columns.");

// Casting as DataColumn - but cast as whatever is approperiate
if (data.Columns.Cast<DataColumn>().Any(x => x == null || x.ColumnName == null))
    throw new InvalidOperationException("Data values are missing or null.");


var records = 
    from record in data.AsEnumerable()
    where (record.Field<string>(data.Columns[0].ColumnName).Contains(txtBC.Text) && 
           record.Field<string>(data.Columns[1].ColumnName).Contains(txtRM.Text) &&
           record.Field<string>(data.Columns[2].ColumnName).Contains(txtClient.Text) &&
           record.Field<string>(data.Columns[4].ColumnName).Contains(txtProduct.Text) &&
           record.Field<string>(data.Columns[7].ColumnName).Contains(txtSegment.Text) &&
           record.Field<string>(data.Columns[6].ColumnName).Contains(txtMonth.Text))
    select record;
dataQuery = records.CopyToDataTable();
dtGridPivot.DataSource = dataQuery;

This will ensure that the column values being loaded, exist or throws a more meaningful exceptions.

Upvotes: 1

Gusdor
Gusdor

Reputation: 14334

I traditionally use the null coellescing operator ?? to check for nulls in my collections and where expressions to filter before selection, grouping or ordering

Upvotes: 0

Related Questions