1

我对 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 查询并只选择一列。

我究竟做错了什么?

4

2 回答 2

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;
于 2012-06-04T13:52:43.443 回答
0
return table.FirstOrDefault(P => P.ITEMID == itemid && P.IMAGESIZE == size); 

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

于 2012-06-04T13:55:26.413 回答