请参阅下面的两个功能相同的查询,sql 和 lambda 版本:
from a in Lines.AsEnumerable()
where a.LineId == SomeGuid
select a
-
Lines.AsEnumerable()
.Where(a => a.LineId == SomeGuid)
.Select(a => a)
两个查询都将被翻译成没有 WHERE 语句的 SQL,比如
SELECT * FROM Line
在 lambda 中,我可以方便地将 AsEnumerable 放在 Where 子句之后,生成的 SQL 将包含 WHERE 子句。所以,lambda 查询就像:
Lines
.Where(a => a.LineId == SomeGuid)
.AsEnumerable()
.Select(a => a)
结果 SQL 是 SELECT * FROM Line WHERE LineId = @param
问题: 如何使用 Linq SQL 语法做到这一点?换句话说,我希望生成的 SQL 语句具有 WHERE 子句。我想避免从表 Line 中提取所有记录。我试图将 AsEnumerable 放在查询中的不同位置,但未能使其工作。
编辑:
在简单的语句中将 AsEnumerable 放在最后会起作用,但是如果您使用投影,则 EF 会抱怨(NotSupported Exception: Complex type can't beConstructed ...)所以,
(from a in Lines
where a.LineId == SomeGuid
select new Line
{
LineId = a.LineId
}).AsEnumerable()
不会工作