C# EF不包括where子句

C# EF不包括where子句,c#,sql,linq,entity-framework,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子句和select(我尝试只选择一列)在

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


我做错了什么?

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


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

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


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

只要抬起头,好吗?o、 FirstOrDefault():null是冗余的。o、 FirstOrDefault()如果找不到匹配项,将返回null。
到底是什么?我刚才把null放在那里了,我实际上是在返回一些东西,但我不想在这里发布它,它不会影响查询,只是一个提示,o.Any()?o、 FirstOrDefault():null是冗余的。o、 FirstOrDefault()如果找不到匹配项,将返回null。
到底是什么?我刚刚把null放在那里,实际上我返回了一些东西,但我不想在这里发布它,它不会影响关于Any和FirstOrDefault的查询True,但是应该在数据库上执行WHERE,不记得了,谢谢!这就解决了问题。我从来不知道IEnumerable是这样工作的。IQueryable似乎在更多情况下都可以使用。这就是linq懒散的原因吗?事实上,如果在可查询对象上编写linq语句,EF以延迟执行的方式工作。但当您将可查询对象强制转换为“实体”类型(如IEnumerable)时,它只执行查询。作为总结,EF将推迟执行,直到IQueryable对象被强制转换为“solid”类型。关于Any和FirstOrDefault为True,但是WHERE应该在数据库上执行,而不是在内存中执行。谢谢!这就解决了问题。我从来不知道IEnumerable是这样工作的。IQueryable似乎在更多情况下都可以使用。这就是linq懒散的原因吗?事实上,如果在可查询对象上编写linq语句,EF以延迟执行的方式工作。但当您将可查询对象强制转换为“实体”类型(如IEnumerable)时,它只执行查询。作为总结,EF延迟执行,直到IQueryable对象被转换为“solid”类型。
SELECT 
[Extent1].[ITEMID] AS [ITEMID], 
[Extent1].........
snap 10 columns
FROM [dbo].[TABLE] AS [Extent1]
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);