I have a data table containing multiple columns and one column that stores somewhat complex text patterns – I need to parse the field to determine if a particular sub strings exist in specific positions within the larger string pattern and then if the record should be filtered out as a result.
I can’t see a way to perform the parse other than by writing a C# parsing function with String.Split method calls, foreach, etc. But if I try to parse like this:
var myFilteredTable = _db.MyTable.Where(t => t.Column1 == 'Filter1'
&& ParseIsMyItemInColumn2(t) );
I get “has no supported translation to SQL” errors.
The other option I thought of was to build the initial result without the Parse:
var myFilteredTable = _db.MyTable.Where(t => t.Column1 == 'Filter1' );
and iterate through the IQueryable resultset, testing each row with the parse function, to filter out the unwanted rows, but IQueryable does not have Remove function to strip out unwanted rows nor Add function to allow me to build up a new resultset.
So how can I filter in linq when I also need to write a Parse function?
Well the “initial filter in the database then do the rest locally” is easy:
AsEnumerableis a simple pass through method, but because the result is typed asIEnumerable<T>rather thanIQueryable<T>, the subsequent LINQ operations use the LINQ to Objects methods inEnumerablerather than the ones inQueryable.Obviously if a lot of items match the first filter but fail the second, that won’t be terribly efficient…