LINQ提供程序如何转换任意代码?

时间:2014-06-26 10:04:12

标签: c# .net linq custom-linq-providers

我知道LINQ提供商是"""将实际的LINQ查询转换为SQL查询(或其他)。它通过遍历LINQ查询的AST并呈现适当的SQL查询来实现。到目前为止,非常好。

现在我可以想象这适用于简单的C#代码,例如

where person.Age >= 18

可以(大部分直接)转换为SQL。但是,如果我提供任意复杂的C#代码,例如:

,该怎么办?
where person.Name.StartsWith(person.Age < 25 ? 'X' : 'Y')

在SQL中没有与此相同的内容,那么在这种情况下LINQ提供程序会做什么?

2 个答案:

答案 0 :(得分:2)

  

SQL

中没有与此相同的内容

不确定它将如何实际编写SQL(您可以测试它),但它可能只是:

where person.Name like (case when person.Age < 25 then 'X' else 'Y' end) + '%'

获取实际 SQL(假设它有效):配置连接。

但确实如此;并非所有事情都是可能的,并且通常只会抛出异常来表明它无法识别某些东西或者无法构造SQL。例如,如果你这样做:

where person.Name.StartsWith(MyCustomMethod(person) ? 'X' : 'Y')

然后我希望它失败。

答案 1 :(得分:1)

通过使用CASE表达式,三元运算符似乎没什么大不了的。

 CASE WHEN Person < 25 THEN 'X' ELSE 'Y' END

否则,您会收到异常,指示您不要在Linq To SQL查询中使用方法调用。我认为虽然支持StartsWith