我对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查询,并只选择一列。
我做错了什么?
答案 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。