namespace EFTest
{
class Program
{
static void Main(string[] args)
{
LegalAidEntities _db = new LegalAidEntities();
Test<User>(_db.User);
Console.Read();
}
static void Test<T>(ObjectQuery<T> oq)
{
PropertyInfo info = typeof(T).GetProperty("id");
//这行可以
Console.Write(oq.Where(delegate(T user) { return info.GetValue(user, null) == null; }).Count());
//这行不行!
//错误:LINQ to Entities 不识别方法
//“System.Object GetValue(System.Object, System.Object[])”
//因此该方法无法转换为存储表达式
Console.Write(oq.Where(user => info.GetValue(user, null) == null).Count());
//理论上这个两行不是等效的吗?
//但是,这行却可以!
List<T> l = new List<T>();
Console.Write(l.Where(user => info.GetValue(user, null) == null).Count());
}
}
}
Console.Write(oq.Where(user => info.GetValue(user, null) == null).Count());默认调用的是Queryable中定义的Where扩展方法,它的参数类型为Lambda<Func<T, bool>>。
而Console.Write(oq.Where(delegate(T user) { return info.GetValue(user, null) == null; }).Count());和Console.Write(l.Where(user => info.GetValue(user, null) == null).Count());调用的是Enumerable类中定义的Where扩展方法,它的参数类型为Func<T, bool>。
参数不同,处理不同,结果自然不同。
针对数据库的SQL的LINQ语句只能识别最普通的delegate如属性的相等之类的,额外调用了类库或自定义函数的话他不能翻译的
你只要想想,你想要的功能自己直接写SQL能不能写出来,能的话就把GetValue里的逻辑直接写出来,不能的话……既然你不能,那电脑怎么可能会?
我也遇到过同样的问题。