1

我知道 LINQ 提供程序是将实际的 LINQ 查询转换为 SQL 查询(或其他)的“东西”。它通过遍历 LINQ 查询的 AST 并呈现适当的 SQL 查询来实现。到目前为止,一切都很好。

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

where person.Age >= 18

可以(主要是直接)翻译成 SQL。但是,如果我提供任意复杂的 C# 代码,例如:

where person.Name.StartsWith(person.Age < 25 ? 'X' : 'Y')

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

4

2 回答 2

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')

那么我预计它会失败。

于 2014-06-26T10:10:17.037 回答
1

CASE使用表达式来渲染三元运算符似乎并不大惊小怪。

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

否则,您会得到一个异常,指示您不要在 Linq To SQL 查询中使用方法调用。我认为这StartsWith是支持的。

于 2014-06-26T10:11:20.960 回答