josephj1989
josephj1989

Reputation: 9709

LINQ TO ENTITIES USING PREDICATE(Func(x,bool) Not Working

I have a Where clause predicate which is fetching records .Now if I use the same in a where clause as a Predicate(ie Func(x,bool) ) it returns no records.My impression was that both were equivalent. - see below

var nonPredicate=this.ObjectSet.Where(x=>!String.IsNullOrEmpty(x.Email) && x.Email.Contains("AND")).ToList();

Func<Model,bool) clause=x=> x=>!String.IsNullOrEmpty(x.Email) && x.Email.Contains("AND");

var predicateRes=this.ObjectSet.Where(clause).ToList();

I expected same results in both cases -but the first produces 29 record result and the second 0 records.

Any Help would be great

Thanks

Upvotes: 0

Views: 126

Answers (1)

Markus Jarderot
Markus Jarderot

Reputation: 89241

Linq to Entitites uses Expression<Func<?,?>> for it's query methods. Lambda expressions are automatically coersed to an expression (Expression<Func<?,?>>) or delegate (Func<?,?>) depending on the type of the variable or argument it is stored in.

// Inline expression
var nonPredicate = this.ObjectSet.Where(x =>
    !string.IsNullOrEmpty(x.Email) && x.Email.Contains("AND")).ToList();

// Delegate type
Func<Model,bool> clauseDelegate = x =>
    !string.IsNullOrEmpty(x.Email) && x.Email.Contains("AND");

// Expression type
Expression<Func<Model,bool>> clauseExpr = x =>
    !string.IsNullOrEmpty(x.Email) && x.Email.Contains("AND");

var predicateRes = this.ObjectSet.Where(clauseExpr).ToList();

Expressions are an object representation of the lambda, which allows the library to translate it into SQL for communication with the database. The same is not possible with delegates, since the structure is already compiled into IL or machine code.

Upvotes: 2

Related Questions