EF不包括where子句

时间:2012-06-04 13:48:21

标签: c# sql linq entity-framework

我对EF有一个小问题。我正在大型表上执行查询,这需要很长时间。我想我找到了原因,但找不到解决办法;

我的LINQ查询如下所示:

IEnumerable<string> o = (from P in Table where P.ITEMID == itemid && P.IMAGESIZE == size select P.PATH);
return o.Any() ? o.FirstOrDefault() : null;

我希望这能产生一个带有where子句的SQL查询,但它实际产生的是:

SELECT 
[Extent1].[ITEMID] AS [ITEMID], 
[Extent1].........
snap 10 columns
FROM [dbo].[TABLE] AS [Extent1]

在枚举后执行where子句和select(我尝试只选择一列)。我想要它做的是使用where子句生成一个SQL查询,并只选择一列。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

由于您正在创建IEnumerable<string>类型的对象,因此EF会在第一行中运行此查询。然后在内存集中执行Any()FirstOrDefault()。 如果你想“继续”编写linq语句并最终运行查询;只需使用IQueryable<T>

IQueryable<string> o = (from P in Table where P.ITEMID == itemid && P.IMAGESIZE == size select P.PATH);
return o.SingleOrDefault();   

但正如Ryan Bennett所说,它更容易使用;

return Table.Where(p => p.ITEMID == itemid && P.IMAGESIZE == size).SingleOrDefault().PATH;

答案 1 :(得分:0)

return table.FirstOrDefault(P => P.ITEMID == itemid && P.IMAGESIZE == size); 

我相信这是你想要完成的。这将在SQL中为您提供where子句,并立即将记录带回或为null。