实体框架5和SQL查询

5

我遇到了严重的性能问题...我的查询应该在数据库中直接使用SQL过滤产品。但当我执行此代码时,它并没有这样做,而是返回所有产品并在C#中对其进行了过滤。

MyContext context = new MyContext();

Func<Product, bool> query = (p => p.UPC.StartsWith("817"));

var products = context.Products.Where(query).Take(10);

我注意到这个变量 products 的类型是 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#代码片段相同的方式执行查询,但使用第二个代码片段的优化。

1个回答

1
尝试使用这个替代方案:
MyContext context = new MyContext();

Expression<Func<Product, bool>> query = (p => p.UPC.StartsWith("817"));

var products = context.Products.Where(query).Take(10);

关于此问题,可以参考以下链接:

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

那里的被接受的答案已经非常详细了,我不敢尝试更好地解释它!


工作正常!感谢您的快速准确回答! - RooSoft
很高兴能够帮忙。我曾经因为类似的情况调试了至少一天的工作,所以我知道那种沮丧感。 - Yuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接