LINQ。如何在Linq(sql语法)查询中使用AsEnumerable? EF4.1

时间:2012-08-13 19:14:56

标签: linq lambda entity-framework-4.1 asenumerable

请参阅下面两个功能相同的查询,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()

无效

1 个答案:

答案 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