C# 是否有些函数无法转换为等价的表达式?
这是我之前在这里提出的一个问题的后续: 那里公认的回答者建议将引用本地对象的表达式重构为Linq to实体可以实际针对备份存储执行的内容(在我的例子中是SQL Server) 我花了很长时间试图想出一些对我所做的工作有用的东西。我的原创C# 是否有些函数无法转换为等价的表达式?,c#,linq,sql-server-2008,c#-4.0,linq-to-entities,C#,Linq,Sql Server 2008,C# 4.0,Linq To Entities,这是我之前在这里提出的一个问题的后续: 那里公认的回答者建议将引用本地对象的表达式重构为Linq to实体可以实际针对备份存储执行的内容(在我的例子中是SQL Server) 我花了很长时间试图想出一些对我所做的工作有用的东西。我的原创 Func<Thing, bool> whereClause Func子句 正在引用Linq to Entities或SQL在运行时无法理解的本地字典对象。我试着重构成多个伪造字典的列表,然后再重构成数组。每次,我都会遇到运行时错误,抱怨上下文无
Func<Thing, bool> whereClause
Func子句
正在引用Linq to Entities或SQL在运行时无法理解的本地字典对象。我试着重构成多个伪造字典的列表,然后再重构成数组。每次,我都会遇到运行时错误,抱怨上下文无法识别列表上的方法或数组索引器之类的内容
最终我放弃了,只是提供了一个额外的方法,当我不能得到正确的表达式时,它使用Func参数
我不是想找到一个解决我具体问题的方法,我只是想知道一般来说,转换是否总是可能的,比如
Func<Thing, bool>
Func
相当于
Expression<Func<Thing, bool>>
表达式
可以针对Linq运行到实体。
或者,如果有许多查询示例,您只需首先将数据拉入内存。您不会将
Func
转换为表达式树-编译器会将lambda表达式转换为表达式树。。。不,这并不总是可能的。例如,不能将语句lambda转换为表达式树:
Expression<Func<string, int>> valid = text => text.Length;
Expression<Func<string, int>> invalid = text => { return text.Length; };
Expression valid=text=>text.Length;
表达式无效=text=>{return text.Length;};
还有其他各种限制
即使你可以创建一个表达式树(如果你手工创建的话,你可以构建一个C#编译器不会构建的表达式树,特别是在.NET 4中),这与表示LINQ到SQL(etc)可以适当转换的内容的表达式树也不是一回事;将lambda转换为表达式树 要对其“各种其他限制”进行一点扩展,handwave:转换为表达式树的lambda可能不包含:
- 声明
- 主要用于状态突变的表达式:赋值、复合赋值、递增和递减运算符
- 任何类型的动态操作
- 多维数组初始值设定项
- 删除部分方法
- 基本访问
- 任何类型的指针操作
- sizeof(T),但T是内置类型的情况除外
- COM样式索引属性调用
- COM样式的“可选引用”调用
- C型变量方法调用
- 可选参数和命名参数调用
- 方法组(当然在调用中除外)
这不是一份详尽的清单;还有一些奇怪的角落案例。但这应该涵盖了大多数人。谢谢Eric。这些只是语言本身提供的限制,对吗?意思是你可以满足所有这些条件,但Linq到SQL仍然无法翻译它?@Erix:正确。我不知道LINQ对SQL有什么限制。