首页 新闻 会员 周边 捐助

LINQ to Entities 的问题

0
[已解决问题] 解决于 2010-03-09 17:39

 

代码
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());
}
}
}

 

 

 

为什么这里不行了呢?
Dozer的主页 Dozer | 初学一级 | 园豆:30
提问于:2010-02-26 14:25
< >
分享
最佳答案
0

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>。

参数不同,处理不同,结果自然不同。

麒麟.NET | 老鸟四级 |园豆:3614 | 2010-03-01 11:38
其他回答(2)
0

针对数据库的SQL的LINQ语句只能识别最普通的delegate如属性的相等之类的,额外调用了类库或自定义函数的话他不能翻译的

你只要想想,你想要的功能自己直接写SQL能不能写出来,能的话就把GetValue里的逻辑直接写出来,不能的话……既然你不能,那电脑怎么可能会?

Gray Zhang | 园豆:17610 (专家六级) | 2010-02-26 18:16
恩,我知道它为什么不行,但问题是,我不用表达式,而是用匿名函数却可以。。。 也就是说匿名函数可以翻译成T-SQL 那 lambda 表达式等效于匿名函数,为什么就不行了呢? 匿名函数 可以翻译成 T-SQL lambda = 匿名函数 lambda 却不可以翻译成 T-SQL 而其中,我觉得那个匿名函数应该没有完全翻译成T-SQL
支持(0) 反对(0) Dozer | 园豆:30 (初学一级) | 2010-02-26 18:37
0

我也遇到过同样的问题。

天堂口 | 园豆:514 (小虾三级) | 2010-02-26 21:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册