Roo*_*oft 5 .net c# sql linq entity-framework
我面临严重的性能问题...我的查询应该直接在数据库中过滤带有SQL的产品.当我执行此代码时,它没有,它返回所有产品并在C#中过滤它们.
MyContext context = new MyContext();
Func<Product, bool> query = (p => p.UPC.StartsWith("817"));
var products = context.Products.Where(query).Take(10);
Run Code Online (Sandbox Code Playgroud)
我注意到products变量是TakeIterator类型.当我稍微更改代码时,我得到了过滤确定,但它迫使我将查询逻辑直接放在同一个方法中,这是我想要避免的.
MyContext context = new MyContext();
var products = context.Products.Where(p => p.UPC.StartsWith("817")).Take(10);
Run Code Online (Sandbox Code Playgroud)
第二个版本是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%'}
Run Code Online (Sandbox Code Playgroud)
我需要弄清楚如何将Func作为参数传递,并以与第一个C#代码摘录相同的方式执行查询,但优化第二个.
试试这个:
MyContext context = new MyContext();
Expression<Func<Product, bool>> query = (p => p.UPC.StartsWith("817"));
var products = context.Products.Where(query).Take(10);
Run Code Online (Sandbox Code Playgroud)
请参阅此问题以了解原因:
为什么要使用 Expression<Func<T>> 而不是 Func<T>?
那里接受的答案是如此完整,以至于我不敢尝试更好地解释它!