日期:2014-05-20  浏览次数:21055 次

Linq to SQL中的一个问题,有关Expression<Func<XX, bool>>和Func<XX, bool>
Hi,

这是我的两段代码:
C# code

ScDataContext db = new ScDataContext();
db.Log = Console.Out;

Expression<Func<TrainingType, bool>> predicate = p => p.Id == 1;

TrainingType type = db.TrainingTypes.FirstOrDefault(predicate);


这样,生成的SQL语句就会是:Select .... From .... Where ... id = 1 ...

而如果不是向FirstOrDefault中传递表达式树,而是传入一个Func委托:
C# code

Func<TrainingType, bool> predicate = p => p.Id == 1;
TrainingType type = db.TrainingTypes.FirstOrDefault(predicate);


那生成的SQL中就不会有Where子句。

这是什么原因呢?

------解决方案--------------------
其实归根结底是两个接口的区别 你可以查一下
------解决方案--------------------
参考
------解决方案--------------------
ms-help://MS.MSDNQTR.v90.chs/fxref_system.core/html/4c9e45f9-0507-c4c6-7b25-3b7a5264e100.htm

IQueryable<(Of <(T>)>)..::.FirstOrDefault 方法

FirstOrDefault(Func<(Of <(UTP, Boolean>)>))
返回序列中满足条件的第一个元素;如果未找到这样的元素,则返回默认值。 (由 Enumerable 定义。) 
已经查出所有记录,然后应用Func


FirstOrDefault(Expression<(Of <(Func<(Of <(UMP, Boolean>)>)>)>))
返回序列中满足指定条件的第一个元素,如果未找到这样的元素,则返回默认值。 (由 Queryable 定义。) 
将表达式直接应用到SQL中.

他们是两种实现.