Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有些函数无法转换为等价的表达式?_C#_Linq_Sql Server 2008_C# 4.0_Linq To Entities - Fatal编程技术网

C# 是否有些函数无法转换为等价的表达式?

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在运行时无法理解的本地字典对象。我试着重构成多个伪造字典的列表,然后再重构成数组。每次,我都会遇到运行时错误,抱怨上下文无

这是我之前在这里提出的一个问题的后续:

那里公认的回答者建议将引用本地对象的表达式重构为Linq to实体可以实际针对备份存储执行的内容(在我的例子中是SQL Server)

我花了很长时间试图想出一些对我所做的工作有用的东西。我的原创

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有什么限制。