请参阅下面两个功能相同的查询,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中,我可以方便地在Where子句之后放入AsEnumerable,结果SQL将具有WHERE子句。所以,lambda查询就像:
Lines
.Where(a => a.LineId == SomeGuid)
.AsEnumerable()
.Select(a => a)
结果SQL是SELECT * FROM Line WHERE LineId = @param
问题: 如何使用Linq SQL语法执行此操作?换句话说,我希望生成的SQL语句具有WHERE子句。我想避免从表格中拉出所有记录。我试图将AsEnumerable放在查询中的不同位置,但我没能使它工作。
修改
在简单的语句中,将AsEnumerable放在最后会起作用,但是如果你使用投影,那么EF抱怨(NotSupported异常:无法构造复杂类型......)
所以,
(from a in Lines
where a.LineId == SomeGuid
select new Line
{
LineId = a.LineId
}).AsEnumerable()
无效
答案 0 :(得分:4)
您只需执行此操作:
var query (from a in context.Lines
where a.LineId == SomeGuid
select a).AsEnumerable();
但在大多数情况下,这不是必需的。它使您的查询可枚举,但不执行您的查询。查询将仅在迭代时执行。
顺便说一下。
.Select(a => a),因为它会自动发生。编辑:
Linq-to-entities禁止投射到映射类型,所以我提到它注释你必须首先投射到匿名类型,调用AsEnumerable
并投射到真实的映射类型。
var query = (from a in Lines
where a.LineId == SomeGuid
select new {
LineId = a.LineId
}).AsEnumerable()
.Select(a => new Line { LineId = a.LineId });
在这种情况下,您甚至不需要匿名类型,因为您可以直接选择a.LineId
。