实体框架5和SQL查询

本文关键字:SQL 查询 框架 实体 | 更新日期: 2023-09-27 18:14:56

我正面临严重的性能问题…我的查询应该过滤产品与SQL直接在数据库中。当我执行这段代码时,它没有,它返回所有的产品,并在c#中过滤它们。

MyContext context = new MyContext();
Func<Product, bool> query = (p => p.UPC.StartsWith("817"));
var products = context.Products.Where(query).Take(10);

我注意到product变量的类型是TakeIterator。当我稍微更改代码时,我得到了过滤,但它迫使我将查询逻辑直接放在同一个方法中,这是我想要避免的。

MyContext context = new MyContext();
var products = context.Products.Where(p => p.UPC.StartsWith("817")).Take(10);

第二个版本是Visual Studio调试器的未公开类型,但它显示为我试图结束的查询,这很好!

{SELECT TOP (10) 
[Extent1].[Id] AS [Id], 
[Extent1].[Brand] AS [Brand], 
[Extent1].[Description] AS [Description], 
[Extent1].[UPC] AS [UPC]
FROM [dbo].[Products] AS [Extent1]
WHERE [Extent1].[UPC] LIKE N'817%'}

我需要弄清楚如何获得一个Func作为参数传递,并以与第一个c#代码摘录相同的方式执行查询,但对第二个进行优化。

实体框架5和SQL查询

试试这个:

MyContext context = new MyContext();
Expression<Func<Product, bool>> query = (p => p.UPC.StartsWith("817"));
var products = context.Products.Where(query).Take(10);

并参考以下问题:

为什么要使用Expression>而不是Func?

公认的答案是如此完整,我不敢尝试解释它更好!