【发布时间】:2014-06-26 10:04:12
【问题描述】:
我了解 LINQ 提供程序是将实际 LINQ 查询转换为 SQL 查询(或其他)的“东西”。它通过遍历 LINQ 查询的 AST 并呈现适当的 SQL 查询来实现。到目前为止,一切顺利。
现在我可以想象这适用于简单的 C# 代码,例如
where person.Age >= 18
可以(大部分直接)翻译成 SQL。但是如果我提供任意复杂的 C# 代码,例如:
where person.Name.StartsWith(person.Age < 25 ? 'X' : 'Y')
在 SQL 中没有与此等效的,那么 LINQ 提供程序在这种情况下会做什么?
【问题讨论】:
-
它只是一个简单的
case... when...,在 Sql 中带有一个like 'xxx%'...您可以查看生成的代码以了解它是如何翻译的。 -
SQL 中有一个等价物:
CASE/WHENinHAVING(即使对于更复杂的表达式)。也就是说,如果 LINQ 无法将该代码转换为 SQL,那么它只会抛出异常...... -
您不能插入任何方法。如果无法翻译表达式树,它将失败。
-
由于您询问的是自定义 linq 提供程序,因此很难说“它”在特定场景中会做什么。但是大多数提供者都会抛出异常。另一种方法是删除它不理解的约束(在 WHERE 子句的情况下),并在内存中评估这些约束(使用 linq 2 对象)
-
基本上它不能转换任意代码,但它可以转换所有被告知的代码,以任何你愿意提供的组合。如果它没有被告知某段代码,它只会抛出某种错误(或者它可能会忽略它,或者坦率地说它可以做任何它想做的事情,但人们希望它会抛出一个异常)。
标签: c# .net linq custom-linq-providers