如何精确地预先判断Linq to Entities中的查询是否能正确生成表达式树?

swiftlei 2011-02-15 10:57:58
Linq to Entities 中由于数据库性能的限制,where中的条件必须生成数据库支持的表达式树才能执行,否则会在执行时返回运行时错误。

原来我以为只要实体的成员不参与本地的运算就不会出现问题,可是下面的代码居然也不能执行,感觉甚是困惑。特此请教各位专家:

static class Test
{
public static string PureCopy(string src)
{
return src;
}
}

当执行: db1.Persons.Where(p=>p.Name == Test.PureCopy("张三"))..... 时,会提示表达式中的Test.PureCopy无效的错误。

当执行:
string name1 = Test.PureCopy("张三");
db1.Persons.Where(p=>p.Name == name1)的时候能正确执行。

问题是为什么Linq To Entities 非得把 Test.PureCopy作为表达式的一部分企图解析为SQL到数据库执行,而不能够事先计算出来,让它等效于db1.Persons.Where(p=>p.Name == name1)呢?

又为什么诸如:
SomeClass instanc1 = new SomeClass();
instance1.Abc.Efg = "张三";
db1.Persons.Where(p=>p.Name == instance1.Abc.Efg) 这样的语句,又能事先把instance1.Abc.Efg换算成字符串值以后再生成表达式树,而不把instance1.Abc.Efg当做要去数据库执行的表达式呢?

如果情况是 db1.Persons.Where(p=>p.Name = instance1.Abc.GetEfg("张三")) 这样的形式又会如何呢?如果用的不是静态方法,是成员方法是否就不会出现这个问题了?
总不能为了避免不可知的错误,我得把所有Where中的值结果,都事先赋值到一个单纯的变量再使用吧?

请问其中是否有什么道理可讲,以便让我事先就能知道Where中的子句是否能被LINQ TO ENTITIES正确处理?
...全文
104 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingdom_0 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 q107770540 的回复:]

try:

class Test
{
public string PureCopy(string src)
{
return src;
}
}

var query=db1.Persons.Where(p=>p.Name == new Test().PureCopy("张三"));
[/Quote]+1.
jianglai11 2011-02-17
  • 打赏
  • 举报
回复
这个是叫什么来着,忘记了
q107770540 2011-02-16
  • 打赏
  • 举报
回复
try:

class Test
{
public string PureCopy(string src)
{
return src;
}
}

var query=db1.Persons.Where(p=>p.Name == new Test().PureCopy("张三"));

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧