c# – 为什么LINQ FirstOrDefault或First生成的调用次数
我注意到我们的应用程序出现了一些性能问题,并将其跟踪到我们类中对ID属性的大量调用.
我已经设置了一个样本来解释. 我们有两个类,Person和Address. 我创建了10个实例,每个实例都有ID字段(Person_Id,Address_Id). 在此示例的情况下,Person_Id为1映射到Address_Id为1. 为了将这些链接在一起,我在Person的’Address’中有一个只读属性,它通过对地址集合执行LINQ查询来返回相关的地址对象. public Address Address { get { return Addresses.FirstOrDefault(a => a.Address_Id == Person_Id); } } Person_Id是具有私有支持字段的公共属性.非常简单. private int _person_Id; public int Person_Id { get { return _person_Id; } set { _person_Id = value; } } 当跟踪调用Person_Id内部的次数时,该数量总是高于人员记录的数量.在这种情况下,我正在迭代人员记录列表并输出人员的姓名和状态. foreach (var person in persons) { var name = person.Name; var state = person.Address.State; Console.WriteLine(name + "t" + state); } 以下是基于迭代的人员实体数量的呼叫数量如何分解: 回顾一下数学,我们可以看到为我们所在的当前实体添加地址调用数会增加对Person_Id的总调用.例如:如果我们迭代了5个人的记录,则有5个人调用get的’Address’属性,15个调用get的’Person_Id’属性. 15是(5 4 3 2 1),调用’地址’的总和. 我很好奇这些数字来自哪里. FirstOrDefault和Find也是如此.如果我使用Single,则呼叫要高得多. 如果我改为创建一个局部变量,例如: int personId = Person_Id; 然后在LINQ查询中使用它: return Addresses.Find(a => a.Address_Id == personId); 然后调用是1到1 – 我有一次调用Address和Person_Id,正如我在LINQ查询中所期望的那样. 有谁知道为什么这些电话会以这种方式膨胀?在进行优化过程中,我有兴趣了解更多信息. 谢谢 解决方法
你基本上是说“对于地址中的每个地址,评估这个谓词,直到谓词返回true,此时返回该地址.”
谓词是lambda表达式,它使用Person_Id属性,因此每次都必须对其进行求值. 或者换句话说,假设您使用普通方法而不是lambda表达式来创建谓词: public Address Address { get { Predicate<Address> predicate = new Predicate<Address>(AddressIdMatches); return Addresses.FirstOrDefault(predicate); } } private boolean AddressIdMatches(Address a) { return a.Address_Id == Person_Id; } 那更清楚了吗?每个地址都会调用一次该方法,并且很明显,每次调用该方法时,它都会评估Person_Id.当你使用lambda表达式时,这就是编译器基本上为你构建的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 学习tree 控件(基础)
- ruby-on-rails – URL中的Rails用户名
- 闪回恢复区 (Flash Recovery Area)
- ruby-on-rails – Rails 3.0 – 最佳实践:模型对象的多个子
- com – 在C中调用Visual Basic DLL,第2部分
- reactjs – React onClick和preventDefault()链接刷新/重定
- ruby-on-rails – 未定义的方法`fog_host =’
- Vue组件开发之LeanCloud带图形校验码的短信发送功能
- org.json与json-lib的区别
- postgresql – 如何有效地获取“最新的相应行”?