Search code examples
c#linqlambda

Dynamic predicate in where clause


I have the below search all fields condition where I specify the column names(Col1,Col2,Col3) I want the column names to be dynamic values which is in a different string array. How is that possible ?

rows is a list of EnumerableRowCollection rows which contains all data and then i apply the contains filter which will filter out the rows which contains the value in objSearch.SearchAllFields

if (objSearch.SearchAllFields != "")
                {
                    rows = results.Where(x => new[]
                                           { x.Field<string>("Col1"),
                                             x.Field<string>("Col2"),
                                             x.Field<string>("Col3")
                                           }.Any(s => s.ToLowerInvariant().Contains(objSearch.SearchAllFields.ToLowerInvariant())));
                }

something like given below which is wrong and doesnt work i know that.

string[] AllColumns = objProp.Select(p => p.Name).ToArray();
                if (objSearch.SearchAllFields != "")
                {
                    rows = results.Where(x => AllColumns.Any(s => s.ToLowerInvariant().Contains(objSearch.SearchAllFields.ToLowerInvariant())));
                }

Original

Col1     Col2    Col3 
test     abc    pqr
2        abc    123
asd      test    xyz 

Expected

Col1     Col2    Col3 
test     abc    pqr
asd      test    xyz

Solution

  • You've tried to change from

    new[]
    { x.Field<string>("Col1"),
      x.Field<string>("Col2"),
      x.Field<string>("Col3")
    }.Any(...
    

    To this:

    AllColumns.Any(...
    

    Assuming AllColumns is IEnumerable<string>, I believe this would be the right solution:

    rows = results.Where(row => AllColumns.Select(column => row.Field<string>(column)).Any(...