加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用传递给方法的lambda表达式会减慢Entity Framework查询

发布时间:2020-12-15 06:29:21 所属栏目:百科 来源:网络整理
导读:我有一个方法: 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 obj
我有一个方法:
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语句和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慢得多.是否有任何理由会影响性能,如果是这样,有什么办法可以保持功能的灵活性吗?

解决方法

运行速度较慢的原因是因为您正在传入一个Func< Bar,bool>这将强制上下文重新启动所有条,然后在返回的结果集上运行Func.使这种运行更好的方法是在表达式< 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
         }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读