gpt4 book ai didi

c# - Linq to Entities Expression/Func 之间的性能差异

转载 作者:太空宇宙 更新时间:2023-11-03 21:32:22 24 4
gpt4 key购买 nike

我只是在测试一个我以不同方式访问的简单查询,但每种方式的速度最多可能相差 2 秒。我希望有人能澄清为什么会这样。我的项目处于非常早期的阶段,所以我想我会确保在它变得太大之前我做对了。

不可否认,我的测试风格并不完美,但我认为它已经足够好了。

我正在使用一个通用的存储库和 UnitofWork,并且我在这个 while 语句中访问了 DB(我本地机器上的 sqlexpress)10,000 次。该表只有 64 条记录。测试在 Release模式下运行。

[TestMethod]
public void MyTestMethod()
{
using (var u = new UnitOfWork())
{
TestA(u);
TestB(u);
}
}

测试A(函数):

public void TestA(UnitOfWork u)
{
Stopwatch s = Stopwatch.StartNew();
s.Start();
var x = 0;
var repo = u.Repository<MyEntity>();
var code = "ABCD".First().ToString();
while (x < 10000)
{
var testCase = repo.Single(w => w.Code == code && w.CodeOrder == 0).Name;
x++;
}
s.Stop();

Console.WriteLine("TESTA: " + s.Elapsed);
}

测试B(表达式):

public void TestB(UnitOfWork u)
{
Stopwatch s = Stopwatch.StartNew();
s.Start();
var x = 0;
var repo = u.Repository<MyEntity>();
var code = "ABCD".First().ToString();
while (x < 10000)
{
var testCase = repo.First(w => w.Code == code && w.CodeOrder == 0).Name;
x++;
}
s.Stop();
Console.WriteLine("TESTB: " + s.Elapsed);
}

尽管我使用的是 First()Single() 调用,但它们不是内置的 LINQ 调用。它们是我存储库的一部分。

First() 表达式(可查询)

public TEntity Single(Func<TEntity, bool> predicate)
{
return dbSet.FirstOrDefault(predicate);
}

Single() 函数(IEnumerable)

public TEntity First(Expression<Func<TEntity, bool>> predicate)
{
return dbSet.FirstOrDefault(predicate);
}

输出:

Test Name: MyTestMethod
Test Outcome: Passed

Result StandardOutput:

TESTA: 00:00:02.4798818
TESTB: 00:00:03.4212112

最佳答案

First() Expression<Func<...>>参数是 IQueryable<T> 上的扩展方法并由查询提供程序使用,例如 LINQ to Entities。您提供的表达式树被转换为适当的 SQL 查询,该查询被发送到 DB,并且仅将必要的行返回给您的应用程序。

First() Func<...>参数是 IEnumerable<T> 上的扩展方法并且被LINQ to Objects使用,这意味着将从数据库中获取所有记录到应用程序内存中,然后元素将作为内存中查询进行搜索,实现为线性搜索。

您绝对应该使用 IQueryable<T> 中的那个,因为它会更高效(因为数据库已针对执行查询进行了优化)。

关于c# - Linq to Entities Expression/Func 之间的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23599664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com