如何精确地预先判断Linq to Entities中的查询是否能正确生成表达式树?
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正确处理?