Similarities and differences of expression<func<tentity, bool>> and Func<tentity, bool>
Public BOOL NULL where class { ifnull) { return dbcontext.set< Tentity>(). ToList (); } Else { return dbcontext.set<tentity>(). Where (predicate). ToList (); } }
I learned by tracking SQL statements
predicate if the delegate type is,dbcontext.set<tentity> (). Where (predicate). ToList (); the corresponding SQL statement is
SELECT [extent1].[ UserID] as [userid], [extent1].[ LoginName] As [LoginName], [extent1].[ Password] As [Password], [extent1].[ UserName] As [UserName], [extent1].[ Usertype] As [usertype], [extent1].[ TEL] as [tel], [extent1].[ CreateDate] As [createdate], [extent1].[ Loginnum] As [Loginnum], [extent1].[ Lastdate] As [lastdate], [extent1].[ Shopid] as [shopid] from [dbo].[ S_users] as [Extent1]
But when predicate is the expression tree, the statement is as follows,
SELECT [Extent1]. [UserID] As [UserID], [extent1].[ LoginName] As [LoginName], [extent1].[ Password] As [Password], [extent1].[ UserName] As [UserName], [extent1].[ Usertype] As [usertype], [extent1].[ TEL] as [tel], [extent1].[ CreateDate] As [createdate], [extent1].[ Loginnum] As [Loginnum], [extent1].[ Lastdate] As [lastdate], [extent1].[ Shopid] as [shopid] from [dbo].[ S_users] as [Extent1] WHERE N'liuyangh' = [Extent1]. [LoginName]
So instead of simply lambda expressions or delegate types, we try to use an expression tree to pass the argument.
Why is that?
Because Dbcontext.set<tentity> (). where (predicate), when it is the expression tree, returns the Iqueryable<tsource>
public static iqueryable<tsource> where<tsource> (this iqueryable<tsource> source, expression< Func<tsource, bool>> predicate);
If the delegate type returns a ienumerable<tsource>
public static ienumerable<tsource> where<tsource> (this ienumerable<tsource> source, func< TSource, bool> predicate);
Entity Framework Fourth Optimization SQL query