gpt4 book ai didi

c# - 使用传递给方法的 lambda 表达式会减慢 Entity Framework 查询的速度吗?

转载 作者:太空狗 更新时间:2023-10-29 17:34:34 27 4
gpt4 key购买 nike

我有一个方法:

public static void GetObjects()
{
using(MyContext context = new MyContext())
{
var objects = context.Bars.Where(b => b.Prop1 != null)
.Select(b => new MyObject{Prop = b.Prop1, Name = b.Name})
.ToList();
foreach(var object in objects)
{
// do something with the object
}
}
}

我重构了该方法,使其更通用,这样我就可以传入一个 Func,这样我就可以指定 where 语句以及 中的 what 属性Bars 表被分配给 MyObject.Prop,如下所示:

public static void GetObjectsV2(Func<Bar, bool> whereFunc, Func<Bar, string> selectPropFunc)
{
using(MyContext context = new MyContext())
{
var objects = context.Bars.Where(whereFunc)
.Select(b => new MyObject{Prop = selectPropFunc(b), Name = b.Name})
.ToList();
foreach(var object in objects)
{
// do something with the object
}
}
}

GetObjectsV2 似乎比 GetObjects 运行得慢得多。是否有任何原因会影响性能?如果是,是否有解决此问题同时仍保持函数灵 active 的方法?

最佳答案

它运行较慢的原因是因为你传入了一个 Func<Bar, bool>这会强制上下文检索 ALL Bars,然后在返回的结果集上运行 Func。使此运行更好的一种方法是传入 Expression<Func<Bar, bool>>

将所有这些放在一起将产生以下结果:

public static void GetObjectsV2(Expression<Func<Bar, bool>> whereFunc, Expression<Func<Bar, string>> selectPropFunc)
{
using(MyContext context = new MyContext())
{
var objects = context.Bars.Where(whereFunc)
.Select(selectPropFunc)
.ToList();
foreach(var object in objects)
{
// do something with the object
}
}
}

关于c# - 使用传递给方法的 lambda 表达式会减慢 Entity Framework 查询的速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4855399/

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