EF 不包括 where 子句

本文关键字:子句 where 不包括 EF | 更新日期: 2023-09-27 18:36:22

我对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 子句和选择(我尝试只选择一列)在枚举后执行。我希望它做的是生成一个带有 where 子句的 SQL 查询并只选择一列。

我做错了什么?

EF 不包括 where 子句

由于要创建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();   

但正如瑞安·贝内特所建议的那样,它更容易使用;

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

我相信这就是你要实现的目标。这将在 SQL 中为您提供一个 where 子句,并立即带回记录或 null。